Angenommen, ich habe ein Modell wie dieses:
class Book(models.Model):
num_pages = ...
author = ...
date = ...
Kann ich ein Wörterbuch erstellen und dann das Modell damit einfügen oder aktualisieren?
d = {"num_pages":40, author:"Jack", date:"3324"}
**
Operator im Python-Referenzhandbuch. docs.python.org/reference/expressions.html#callsAntworten:
Hier ist ein Beispiel für das Erstellen mit Ihrem Wörterbuch d:
Um ein vorhandenes Modell zu aktualisieren, müssen Sie die QuerySet-
filter
Methode verwenden. Angenommen, Sie kennen daspk
Buch, das Sie aktualisieren möchten:quelle
update()
respektiert keine Signale. Siehe die Antwort von @leech unten.Wenn Sie wissen, dass Sie es erstellen möchten:
Angenommen, Sie müssen nach einer vorhandenen Instanz suchen, können Sie diese mit get oder create finden:
instance, created = Book.objects.get_or_create(slug=slug, defaults=d) if not created: for attr, value in d.items(): setattr(instance, attr, value) instance.save()
Wie in einer anderen Antwort erwähnt, können Sie die
update
Funktion auch im Queryset-Manager verwenden, aber ich glaube, dass dadurch keine Signale gesendet werden (was für Sie möglicherweise nicht wichtig ist, wenn Sie sie nicht verwenden). Sie sollten es jedoch wahrscheinlich nicht verwenden, um ein einzelnes Objekt zu ändern:quelle
.save()
?that will not send any signals out
: kann das nicht genug betonen.Verwenden Sie diese
**
Option, um ein neues Modell zu erstellen. Durchlaufen Sie das Wörterbuch und verwenden Sie essetattr()
, um ein vorhandenes Modell zu aktualisieren.Aus Tom Christies Django Rest Framework
https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py
for attr, value in validated_data.items(): setattr(instance, attr, value) instance.save()
quelle
**
zum Aktualisieren möglicherweise keine gute Idee ist?queryset.update(**fields)
ist laut django docs eine gute Idee. Zitat: "Wenn Sie nur einen Datensatz aktualisieren und nichts mit dem Modellobjekt tun müssen, ist es am effizientesten, update () aufzurufen, anstatt das Modellobjekt in den Speicher zu laden."Wenn Sie bereits ein Django-Objekt haben und dessen Feld aktualisieren möchten, können Sie dies ohne Filter tun. weil Sie es bereits haben, können Sie in diesem Fall:
quelle
Zusätzlich zu anderen Antworten ist hier eine etwas sicherere Version, um zu verhindern, dass verwandte Felder durcheinander gebracht werden:
def is_simple_editable_field(field): return ( field.editable and not field.primary_key and not isinstance(field, (ForeignObjectRel, RelatedField)) ) def update_from_dict(instance, attrs, commit): allowed_field_names = { f.name for f in instance._meta.get_fields() if is_simple_editable_field(f) } for attr, val in attrs.items(): if attr in allowed_field_names: setattr(instance, attr, val) if commit: instance.save()
Es wird überprüft, ob das zu aktualisierende Feld bearbeitet werden kann, kein Primärschlüssel ist und nicht zu den verwandten Feldern gehört.
Anwendungsbeispiel:
book = Book.objects.first() update_from_dict(book, {"num_pages":40, author:"Jack", date:"3324"})
Die luxuriösen DRF-Serialisierer
.create
und.update
-Methoden haben den begrenzten und validierten Satz von Feldern, was bei manuellen Updates nicht der Fall ist.quelle