2012-05-21 13 views
8

Mam listę, na której chciałbym wpisać bulk_create wpisów w bazie danych.Django 1.4 - bulk_create z listą

W jaki sposób mogę to zrobić bez przechodzenia przez listę, co, jak sądzę, zabrałoby punkt bulk_create.

Na przykład:

Zamiast ...

for x in list: 
    bulk_create... 

Jak mogłem ...

bulk_create for the entire list at once in an efficient manner 

Lista zawiera:

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

Jest to po prostu lista z id, nie w formie, która jest ponownie należy wprowadzić bezpośrednio do bulk_create (nie sformatowanego za pomocą pól wprowadzania). Jednak przypuszczam, że byłoby możliwe zmodyfikowanie listy przed przekazaniem jej do bulk_create.

+0

Co znajduje się na twojej liście? – jdi

+0

Nie rozumiem. Chcesz utworzyć listę obiektów z jawnymi identyfikatorami, zamiast pozwolić im na auto-incriment? Czy to jest to, czego szukasz? – jdi

+0

@jdi Zamienię przykład i spróbuję podać bardziej konkretny przykład. – snakesNbronies

Odpowiedz

21

bulk_create pobiera listę obiektów jako pojedynczy argument w jednym wywołaniu. Co robisz w swoim przykładzie byłby taki sam jak zapętlenie i robi create()

Odwoływanie: 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 odnosi się do listy obiektów, które już instancja i trzeba stworzyć luzem z jednego pytanie. Jeśli na przykład, że nie mają już tej listy niezapisanych przypadkach, i trzeba było listę wartości, można następnie utworzyć listę z czymś w rodzaju:

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

A może masz listę surowych wartości słownikowych że mapa do modelu:

values = [{headline="abc"}, {headline="def"}, {headline="ghi"}] 
aList = [Entry(**vals) for vals in values] 
+0

To nadal wymagałoby ręcznego wstawiania argumentów do "aList". Czy możesz wymyślić jakieś sposoby, aby to pominąć? Mam już listę. Przypuszczam, że ** MOGĘ ** przekonwertować go na listę ciągów, z których każda ma dokładnie to, co wymieniono w liście? – snakesNbronies

+0

@thong: Myślę, że być może brakuje ci sensu. Jeśli masz już listę obiektów, po prostu przekaż tę listę do 'bulk_create' jeden raz. W tym przykładzie pokazano, co zawiera lista, aby go przekazać. Jeśli nadal nie masz pewności co do tej części, czy możesz zaktualizować swoje pytanie, aby pokazać, co masz na liście? – jdi

+0

lista nie ma formatu twojej listy. Spróbuję edytować, zmieniając listę, aby sprawdzić, czy to działa. – snakesNbronies

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

Ty przechodząc ORM listę instancji obiektów na liście. Korzystanie z tego, a zakładając, że orig_list jest lista słowników,

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

Spróbuj, a punkt bulk_create jest trafienie bazy danych tylko raz, bez względu na to ile tworzysz. Dlatego uważamy, że jest skuteczny.

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]) 

--- Edit ---

Powiedzmy, że masz model takiego, w models.py:

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

I masz listę tak (skopiowane bezpośrednio z Twoje pytanie):

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

Wystarczy jedna linia:

Entry.objects.bulk_create([Entry(id=x) for x in list]) 
+0

To nadal wymagałoby ręcznego wpisania argumentów na liście a. Czy możesz wymyślić jakieś sposoby, aby to pominąć? – snakesNbronies

+0

@thong Myślę, że przeoczyłeś część mojej odpowiedzi. lista tutaj jest przeznaczona wyłącznie do celów demonstracyjnych, nie ma potrzeby "ręcznego wprowadzania". Zobacz edycję. – xbtsw

+0

dzięki! Jestem raczej nowy w programowaniu, więc nie dostałem go do czasu edycji. – snakesNbronies