ストーリーとカテゴリを備えたブログのようなアプリケーションがあります。
class Category(models.Model):
...
class Story(models.Model):
categories = models.ManyToManyField(Category)
...
多対多フィールドを持つモデルの新しいインスタンスを保存すると、オブジェクトがまだデータベースにないために問題が発生することがわかりました。この問題は通常、フォームの送信時に現れますが、これは でうまく回避できますstory_form.save(commit=False)
。語るべき形がない状況はどうですか?私の場合、リモート送信を受け入れる API を構築したいと考えています。私は JSON が好きで、社内の他の多くのメッセージ (このサーバーからの送信メッセージを含む) は JSON であるため、次のメッセージを受信できるようにしたいと考えています。
{ "operation": "INSERT",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
値をインスタンスに変換するファクトリを実装します。しかし、私は工場が操作の種類にできるだけとらわれないようにしたいと考えています。そう:
{ "operation": "UPDATE",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
INSERT は id を無視し、UPDATE は既存のインスタンスを取得して上書きすることを除いて、同様に変換する必要があります。(リモート サブミッターは、特にキャッシュするカテゴリ オブジェクトを提供するフィードをリッスンするため、id でそれらを参照できますし、参照する必要がありますが、データベースとの直接通信はありません。)
私の本当の質問は、ManyToManyManager が関与する Django モデル オブジェクトのインスタンスをインフレートするのに最も簡単で一貫性のあるものは何かということです。私の知る限り、多対多フィールドを持つオブジェクトの挿入には、最初に新しい ID を取得する必要があるという理由だけで、2 つのデータベース ヒットが必要です。しかし、私の現在の厄介な解決策は、オブジェクトをすぐに保存して非表示にすることです。これにより、関数がそれを操作して、もう少し意味のあるものとして保存できます。save
ID のないオブジェクトが一度保存され、いくつかのプロキシ フィールドが にコピーされてからcategories
、再度保存されるように、1 ステップ アップするとオーバーライドされるようです。何よりも、問題を解決してくれる堅牢なマネージャー オブジェクトが必要です。おすすめは何ですか?