Вопрос по python – Django 1.4 - создать список

8

У меня есть список, для которого я хотел бы создать записи в базе данных.

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

Например:

Вместо...

for x in list:
    bulk_create...

Как я мог...

bulk_create for the entire list at once in an efficient manner

Список содержит:

list = ['abc', 'def', 'ghi']

Это просто список идентификаторов, а не в форме, которая готова к подаче непосредственно в bulk_create (не отформатирован с полями ввода). Тем не менее, я полагаю, что можно было бы изменить список перед передачей его в bulk_create.

Что в твоем списке? jdi
@jdi Я переделаю пример и попытаюсь привести более конкретный пример. snakesNbronies
Я не понимаю. Вы хотите создать список объектов с явными идентификаторами, вместо того, чтобы разрешать им автоинкримент? Это то, что вы после? jdi

Ваш Ответ

3   ответа
21

bulk_create принимает список объектов как один аргумент за один вызов То, что вы делаете в своем примере, будет таким же, как циклы иcreate()

Реферирование:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

aList = [
    Entry(headline="Django 1.0 Released"),
    Entry(headline="Django 1.1 Announced"),
    Entry(headline="Breaking: Django is awesome")
]
Entry.objects.bulk_create(aList)

aList относится к списку объектов, которые вы уже создали, и которые нужно создать массово с помощью одного запроса. Если, например, у вас еще не было этого списка несохраненных экземпляров, и у вас был список значений, вы могли бы тогда создать свой список с чем-то вроде:

values = ['abc', 'def', 'ghi']
# a list of unsaved Entry model instances
aList = [Entry(headline=val) for val in values]

Или, может быть, у вас есть список необработанных значений словаря, которые сопоставляются с моделью:

values = [{headline="abc"}, {headline="def"}, {headline="ghi"}]
aList = [Entry(**vals) for vals in values]
Error: User Rate Limit Exceededbulk_createError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded snakesNbronies
@thong: я только что обновил список значений в соответствии с вашим примером. Это объясняет это?
список не в формате вашего списка. Я попытаюсь изменить список, чтобы проверить, работает ли он. snakesNbronies
Это по-прежнему требует, чтобы я вручную вводил аргументы в «aList». Можете ли вы придумать способы пропустить это? У меня уже есть список. Я полагаюCOULD преобразовать его в список строк, каждая из которых содержит именно то, что вы перечислили в aList? snakesNbronies
3
>>> Entry.objects.bulk_create([
...     Entry(headline="Django 1.0 Released"),
...     Entry(headline="Django 1.1 Announced"),
...     Entry(headline="Breaking: Django is awesome")
... ])

и предположив, что orig_list является списком словарей,

>>> my_objects = [MyObject(a=x['a'], b=x['b']) for x in orig_list]
>>> MyObject.objects.bulk_create(my_objects)
1

и основная задача метода bulk_create заключается в том, чтобы обращаться к базе данных только один раз, независимо от того, сколько вы создаете. Вот почему мы считаем его эффективным.

class Entry(models.Model):
    name = models.CharField(max_length = 10)

a = ['test1', 'test2', 'test3', 'test4']

Entry.objects.bulk_create([Entry(name=x) for x in a])

---Редактировать---

Скажем, у вас есть модель, подобная этой, в вашем models.py:

class Entry(models.Model):
    id = models.CharField(max_length = 10)

И у вас есть такой список (прямо скопированный из вашего вопроса):

list = ['abc', 'def', 'ghi']

Просто одна строка:

Entry.objects.bulk_create([Entry(id=x) for x in list])
@ thong Я думаю, вы пропустили часть моего ответа. Перечислите здесь только для демонстрации, нет необходимости "вставлять вручную". Смотрите редактировать.
Это по-прежнему требует, чтобы я вручную указывал аргументы в списке a. Можете ли вы придумать способы пропустить это? snakesNbronies
Спасибо! Я довольно новичок в программировании, так что я не получил его до редактирования. snakesNbronies

Похожие вопросы