私はあなたの希望の行動の両方にアプローチする最良の方法は、信号ではなく、むしろ(セーブでオーバーライドされたと思う)と引数を使用して明示的に定義するthrough
テーブルの上に()メソッドを削除through
https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField.throughを参照してください。この:このようなhttps://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods
何か:
# -*- coding: utf-8 -*-
from django.db import models
class Item(models.Model):
# fields
# ...
class Collection(models.Model):
items = models.ManyToManyField(Item, related_name="collections", through="CollectionItem")
# other fields
# ...
class CollectionItem(models.Model):
collection = models.ForeignKey(Collection)
item = models.ForeignKey(Item)
def save(self, *args, **kwargs):
# Only allow this relationship to be created on some_condition
# Part 1 of your question.
if some_condition:
super(CollectionItem, self).save(*args, **kwargs)
# Update some fields on Collection when this
# relationship is created
# Part 2 of your question (1/2)
self.Collection.updateSomeFields()
def delete(self, *args, **kwargs):
collection = self.collection
super(CollectionItem, self).delete(*args, **kwargs)
# Update some fields on Collection when this relationship
# is destroyed.
# Part 2 of your question (2/2)
collection.updateSomeFields()
ところで、あなたは関係を追加することがモデルを通じて、この節約信号を発生しますことがわかります。
シグナルについては、スルーテーブルを作成すると、pre_saveやpost_save信号を聞くことができますが、どちらも直接関係の作成を拒否することはできません。
モデルの1つまたは両方がサードパーティから提供されており、本当にスルーテーブルを作成できない場合は、信号経路が唯一の方法です。 、あなたがm2m_changedイベントを監視し、あなたのコレクションオブジェクト(あなたの質問の一部2)への更新をトリガし、遡及的に不適切に作成された関係(あなたの質問の一部1)を削除することができ、その場合には
https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed
。しかし、この後者のビットは醜いクルージングなので、私はあなたができる場合は、明示的なテーブルをスティックしたいと思います。
問題1の場合、フォームのクリーニングサイクルを使用してデータを検証する必要があります(検証メッセージングが容易になる)ので、[save_m2m](https://docs.djangoproject)に送信してください。 –
@Hedde:私のデータはフォームから変更されない可能性が高いので、モデルに近いソリューションが望ましいです。 (CLIツールや公開されているAPIを通じて) – Constantinius
少なくともロジックの一部についてはモデル保存メソッドを上書きすることができますが、APIを実装する場合は、そのロジックがAPIの承認レイヤーに属しているようです。 TastypieはDjangoでうまくいく素晴らしいAPIです。 –