Effiziente Weise zu aktualisieren, die mehrere Felder von Django-model-Objekt
Ich bin versucht, zu aktualisieren Benutzer in Django-Datenbank.
Abgerufenen Daten ist wie folgt :
fetched_data = {
'id': 1,
'first_name': 'John',
'last_name': 'Doe',
'phone': '+32 12',
'mobile_phone': '+32 13',
'email': '[email protected]',
'username': 'myusername'
}
Bekomme ich die Benutzer mit dieser id wie folgt :
old_user = User.objects.get(pk=fetched_data['id'])
Wenn ich ein update für die Benutzer wie folgt :
old_user.username = fetched_data['username']
old_user.first_name = fetched_data['first_name']
......
old_user.save()
funktioniert es einwandfrei, aber ich will nicht, es zu tun für jeden Datensatz, so habe ich versucht, etwas wie :
for fetched_data_key in fetched_data:
old_user.fetched_data_key = fetched_data['fetched_data_key']
//old_user[fetched_data_key] = fetched_data['fetched_data_key'] --- I tried this way to
old_user.save()
Aber das funktioniert nicht. Irgendeine Idee, wie kann ich ein update der user, ohne es für jeden Datensatz?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie aktualisieren eine Zeile in der Datenbank, ohne dass das Holen und Deserialisieren es;
update()
kann es tun. E. g.:Wird dies Problem eine SQL
update
- Anweisung, und ist viel schneller als der code in deinem post. Es wird nie die Daten abzurufen, oder verschwenden Zeit mit der Erstellung einerUser
Objekt.Können Sie nicht, wenn, dann senden Sie eine ganze Reihe von update-Daten mit der SQL-Datenbank und bitten Sie Sie, um eine Karte zu verschiedenen Zeilen in einem Rutsch. Wenn Sie benötigen ein massiven update wie das geschieht sehr schnell, Ihre beste Wette ist wahrscheinlich das einfügen der Daten in eine separate Tabelle und dann aktualisieren Sie bilden eine
select
in der Tabelle. Django ORM dies nicht unterstützt, soweit ich das sagen kann.Sogar einfacher, wenn Sie verwenden
.update()
Methode derQuerySet
Objekt als:Wird es entpacken Sie den Inhalt
fetched_data
dict und aktualisiert die Datensätze inUser
Objekt, dessen Spalten vorhanden sind, als Schlüssel derfetched_data
dict. Da Sie den Aufruf von filter aufpk
es immer wieder einzelnen Datensatz.Wenn Sie
.update
dann gibt es ein Problem, da es nicht zu erhöhen post_save oder pre_save signal, so dass, wenn Sie verwenden möchten, jedes signal auf jede änderung der Daten, dannUser.objects.filter(pk=fetched_data['id']).update(**kwargs)
wird nicht funktionieren.So können Sie
setattr()
aktualisieren Sie die Felder und dann.save
würde speichern Sie die Zeile, die aktualisiert werden würde, den Zeilen-auch das ein signal.