Ich habe eine Blog-ähnliche Anwendung mit Geschichten und Kategorien:Einfügen Objekt mit ManyToMany in Django
class Category(models.Model):
...
class Story(models.Model):
categories = models.ManyToManyField(Category)
...
Jetzt weiß ich, dass, wenn Sie mit einem many-to-many-Feld, eine neue Instanz eines Modell speichern Probleme entstehen, weil das Objekt noch nicht in der Datenbank ist. Dieses Problem manifestiert sich normalerweise bei der Formularübergabe, die mit story_form.save(commit=False)
sauber bearbeitet werden kann. Was ist mit einer Situation, in der es keine Formen zu sprechen gibt? In meinem Fall möchte ich eine API erstellen, um Remote-Übertragungen zu akzeptieren. Da ich JSON mag, und eine ganze Menge anderer Messaging in unserem Unternehmen ist in JSON (einschließlich ausgehenden Nachrichten von diesem Server), würde Ich mag Lage sein, die folgend erhalten:
{ "operation": "INSERT",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
und eine Fabrik implementieren Das konvertiert die Werte in Instanzen. Aber ich möchte, dass die Fabrik so agnostisch wie möglich für die Art der Operation ist. Also:
{ "operation": "UPDATE",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
soll auch auf die gleiche Weise umgewandelt werden, mit der Ausnahme, dass INSERT ignoriert id und UPDATE wird die bereits vorhandene Instanz und außer Kraft gesetzt. (Der Remote-Übermittler hört auf einen Feed, der unter anderem die zu cachenden Kategorieobjekte bereitstellt. Er kann und muss sich daher auf diese per ID beziehen, hat jedoch keine direkte Kommunikation mit der Datenbank.)
Meine eigentliche Frage ist: Was ist die einfachste Konsistenz, um eine Instanz eines Django-Modellobjekts aufzublasen, an dem ein ManyToManyManager beteiligt ist. Soweit ich es ergründen kann, erfordert jedes Einfügen eines Objekts mit einem Viele-zu-Viele-Feld zwei Datenbanktreffer, nur weil es notwendig ist, zuerst eine neue ID zu erhalten. Aber meine derzeitige peinliche Lösung besteht darin, das Objekt sofort zu speichern und es versteckt zu markieren, damit Funktionen auf der ganzen Linie damit spielen und es als etwas aussagekräftiger speichern können. Es scheint so, als würde ein Schritt save
überschreiben, so dass Objekte ohne IDs einmal speichern, ein Proxy-Feld in categories
kopieren und dann erneut speichern. Das Beste von allem wäre ein robustes Manager-Objekt, das mir die Probleme erspart. Was empfehlen Sie?
Ich mag das mehr oder weniger. Ich denke immer noch, dass es Unsinn ist, dass man vor dem Speichern nicht auf ein m2m-Feld zugreifen kann. Das beabsichtigte Verhalten ist offensichtlich. –