Подтвердить что ты не робот

Использование объектов Django bulk_create во внешних ключах?

Я читал Django bulk_create и несколько его "недостатков":

"
This has a number of caveats though:

1. The model save() method will not be called, and the pre_save and post_save signals will not be sent.
2. It does not work with child models in a multi-table inheritance scenario.
3. If the model primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does.
"

Я не совсем понял это. Поэтому, если у меня есть список объектов, перейдите в файл bulk_create:

objList = [a, b, c,] #none are saved
model.objects.bulk_create(objList)

Могу ли я использовать эти объекты в внешних ключах?

for obj in objList:
    o = otherModel(something='asdfasdf', fkey=obj)
    o.save() # will this be fine given the caveats stated above?

Так будет ли отношение foreignKey в порядке? Также, когда он говорит 2. Он не работает с дочерними моделями в сценарии наследования с несколькими таблицами, это означает, что любая модель, которая наследуется от другой модели (абстрактная или нет), не может использовать bulk_create?

4b9b3361

Ответ 1

Попробуйте настроить идентификаторы вручную. Чтобы предотвратить условия гонки, обязательно включите функцию как одну транзакцию.

from django.db import transaction, models

@transaction.commit_on_success
def bulk_create_with_manual_ids(foo_list):
    id_start = (Foo.objects.all().aggregate(models.Max('id'))['id__max'] or 0) + 1
    for i,foo in enumerate(foo_list): foo.id = id_start + i
    return Foo.objects.bulk_create(foo_list)

objList = [Foo(),Foo(),Foo()]
foo_objects = bulk_create_with_manual_ids(objList)
Bar(foo=foo_objects[0]).save()

Обратите внимание, что этот подход непригоден для любой таблицы, в которой есть поле serial или другое автоинкрементное в базе данных сгенерированное ключ. Ключ не будет увеличиваться при создании массива, так как идентификаторы генерируются на стороне Django.

Ответ 2

Для первого вопроса нет, вы не сможете этого сделать, потому что obj не будет иметь свой основной набор ключей, поэтому он не может использоваться как внешний ключ.

Второй вопрос, нет, что не то, что он говорит вообще. В нем конкретно упоминается "наследование с несколькими таблицами": наследование от абстрактной модели не является наследованием нескольких таблиц.