Django CreateView Multiple Object Insert - PullRequest
0 голосов
/ 21 мая 2018

Я понятия не имею, каким должен быть заголовок, но здесь у меня есть случай, когда, если форма была отправлена, она найдет данные из другой модели и вставит каждую соответствующую.

в настоящее время здесь мой код.

здесь мой models.py

class Foo(models.Model):
    name = models.CharField()
    value = models.DecimalField()

class Bar(models.Model):
    name = models.CharField()
    date = models.DateField()
    foo = models.ForeignKey(Foo, related_name='foo')

здесь мой views.py

class Foo(CreateView):
    fields = ('name', 'value')
    model = models.Foo

    def form_valid(self, form):
        self.object = form.save(commit=False)
        for i in range(30):
            self.object.bar.foo.append(self.object.id)


        return super(ModelFormMixin, self).form_valid(form)

Bar с ForeignKey по Foo пример, если форма была отправлена ​​с range(30) найдет Bar и вставит (append) Foo id для всех данных.теперь я делаю с этим,

self.object.bar.foo.append(self.object.id), но с ошибкой 'Foo' object has no attribute 'bar'

как вставить append несколько данных в Bar из Foo(CreateView)? ...

1 Ответ

0 голосов
/ 21 мая 2018

Прежде всего, append является методом list, а отношение FK определенно не является списком.Во-вторых, вы использовали related_name='foo' в вашей Bar модели, так что на самом деле вы можете получить Bar из Foo, используя foo.foo.Я уверен, что это ошибка.Пока у одного Foo может быть много Bar, ваш related_name должен быть bars, поэтому вы сможете использовать foo.bars.all().Чтобы создать Bar, вы должны сначала сохранить Foo, поэтому используйте commit=True.
И последнее.В вашем для цикла используйте Bar.objects.create(foo=self.object).Вы также хотели бы использовать bulk_create для оптимизации этого цикла, чтобы вы не делали 30 запросов к базам данных, а только один.Для этого создайте список bars = [] перед циклом.Чем внутри цикла использовать bars.append(Bar(foo=self.object).Здесь append - это метод list, поэтому вы просто создаете список Bar объектов без сохранения их в базе данных.И, наконец, после цикла используйте Bar.objects.bulk_create(bars), чтобы сохранить их в базе данных.

Я перечитал ваш вопрос и, возможно, я упустил суть.Как вы хотите «найти» свой Bar?Кроме того, вы не можете добавить несколько Foo к вашему Bar, потому что это если FK, что означает один объект.

...