2016-04-21 3 views
0

Sagen wir, ich habe eine Liste von dicts mit E-Mails und Geburtstage:Weg zur Massenaktualisierung (mit eindeutigen Werten) in Django

p = [\ 
    {'email': '[email protected]', 'birthday': '1990-01-01'}, 
    {'email': '[email protected]', 'birthday': '1980-02-05'}, 
    #...etc 
] 

Ich möchte die People Objekte in der Datenbank aktualisieren. Die rohe SQL würde normalerweise so viele Anfragen wie len(p), so das macht mich denken, tun:

from django.db import IntegrityError, transaction 
for person in p: 
    try: 
     with transaction.atomic(): 
      People.objects.filter(email=person['email']).update(birthday=person['birthday']) 
    except IntegrityError: 
     #handle the exception 

Ich bin nicht genug in Django erfahren zu wissen, ob dies eine gute Praxis ist aber. Was ist die pythischste Art auszudrücken, was ich versuche zu tun?

+0

Sind alle diese E-Mail-IDs bereits in der Datenbank vorhanden? Könnte es mehrere Einträge in der Tabelle "Personen" für dieselbe E-Mail-ID geben? – AKS

+0

Ich denke, es wäre eine gute Übung, das Update zu überprüfen, aber es sollte keine Duplikate geben. Dies ist bereits beim Einfügen bestätigt. Im obigen Code erhalten alle Personen, die dieselbe E-Mail-Adresse haben, denselben Geburtstag. – Escher

+0

Für besseren Code könnten Sie 'mit transaction.atomic():' außerhalb Ihrer for-Schleife schreiben. – AKS

Antwort

0

Wenn Sie filtern und aktualisieren, wird das gleiche Update auf alle gefilterten Einträge angewendet. Django bietet keine Massenaktualisierung, bei der Sie verschiedene Werte für verschiedene Einträge aktualisieren können.

Sie können Ihren Code besser, indem die for Schleife innerhalb des transaction.atomic() Block anstatt den atomaren Blocks für jeden Eintrag in der for-Schleife machen:

with transaction.atomic(): 
    for person in p: 
     try:    
      People.objects.filter(email=person['email']).update(birthday=person['birthday']) 
     except IntegrityError: 
      #handle the exception 
0

Es ist eine Bibliothek: django-bulk-update.

people = Person.objects.all() 
for person in people: 
    person.name = random.choice(random_names) 

bulk_update(people, update_fields=['name']) 
# or 
Person.objects.bulk_update(people, update_fields=['name']) 
Verwandte Themen