1

Django の既存のロジックが自然に関係を強制するように、誰かがモデルとの次の一般的な関係を表す最も Djangoic な方法を教えてくれることを願っています。

モノ A とモノ B は両方とも、多くのタイプの 1 つを持っています。モノ A は、多くのモノ、1 つ、またはまったくモノ B に関連付けることができ、またその逆も (対称的に) 行うことができますが、モノ A とモノ B は、それらが同じタイプを共有している場合にのみ関連付けることができます。

私の現在の実装では、A、B、および Type の 3 つのモデルを使用します。ここで、As と B は Type への外部キーを持ち、A は B との m2m を持ちます。

class A(models.Model):
    b = models.ForeignKey(B)
    typ = models.ManyToManyField(Type)

class B(models.Model):
    a = models.ForeignKey(A)

class Type(models.Model):
    name = models.CharField()

これにより、やりたいことを実行できますが、A が別のタイプの B を持つことができないという事実は強制されません。制御するビューでフィルタリング ロジックを使用できますが、管理者のようにあまり制御できないところでは、Django を使用して As をさまざまなタイプの B にマップできます。Django で As、B、Types の関係を表す別の方法はありますか?

4

2 に答える 2

0

これは私の頭の上からの私のアプローチです:

class A(models.Model):
    typ = models.ManyToManyField(Type)

    @property
    def related2B(self)
        return list of relationships

    def save
        check that relationship is still valid if typ field changes

class B(models.Model):
    typ = models.ManyToManyField(Type)

    @property
    def related2A(self)
        return list of relationships

    def save
        check that relationship is still valid if typ field changes

class Type(models.Model):
    name = models.CharField()


class Relationship(models.Model):
    classA = models.ForeignKey(A)
    classB = models.ForeignKey(B)

    def save
        do check that they share a type before saving
于 2013-09-19T08:32:11.083 に答える
0

M2M の範囲を制御する方法としてlimit_choices_toを調べましたか?

複雑なクエリには Q オブジェクトを使用できますが、(親オブジェクトの現在の状態を含む複雑なクエリの場合) F オブジェクトではないと推測していますが、不適切な場合は保存を拒否できる場合があります

于 2013-09-19T09:51:45.067 に答える