29 мая 2012 г., 14:02 отDerek

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

Я читал о Django bulk_create и нескольких его «недостатках»:

"
This has a number of caveats though:

1. The model's 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's 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?

Ответы на вопрос(2)

29 мая 2012 г., 18:14 отDaniel Roseman

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

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

30 окт. 2012 г., 21:04 отJosh

убедитесь, что функция заключена в одну транзакцию.

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.

ВАШ ОТВЕТ НА ВОПРОС