4

次のモデルが与えられた場合:(説明のためだけにある TextFields を気にしないでください)

class Base(models.Model):
   field1 = models.TextField()

   class Meta:
      abstract=True

class Child1(Base):
   child1_field = models.TextField()

class Child2(Base):
   child2_field = models.TextField()


class Content(models.Model):
    aso_items = models.ManyToManyField('Base')

これらの定義によれば、Content オブジェクトは複数の Base オブジェクトに関連付けることができます。インタビュー(=Contentオブジェクト)は、ミュージシャン(=Child1オブジェクト)、映画監督(=Child2)などとリンクできます。

さて、私の質問ですが、 aso_items フィールドが指しているモデルに従ってコンテンツオブジェクトをフィルタリングすることは可能ですか? 例: Child1 の特定のオブジェクトに関連付けられたすべてのコンテンツ オブジェクト (たとえば、ミュージシャンのボブ ディランに関連付けられたすべてのインタビュー) を含むクエリセットが必要だとします。

さらに、Child1 オブジェクトに関連付けられたすべての Content オブジェクトを含む QuerySet が必要な場合はどうすればよいでしょうか? (たとえば、ミュージシャンに関連付けられたすべてのインタビュー) これにより、フィルタリングはどのように変化しますか?

前もって感謝します ps: プレビューで空白に問題が発生しています。ご容赦ください。

4

3 に答える 3

7

related_name抽象基本クラスの使用に関する Django ドキュメントのセクションを確認する必要があります。http://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

ドキュメントを引用するには:

related_name ForeignKey または ManyToManyField で属性を使用している場合は、常にフィールドに一意の逆引き名を指定する必要があります。これは通常、抽象基本クラスで問題を引き起こします。これは、このクラスのフィールドが各子クラスに含まれ、属性 ( を含む related_name) が毎回まったく同じ値になるためです。

この問題を回避するには、抽象基本クラス (のみ) で related_name を使用している場合、名前の一部を string にする必要があります%(class)s。これは、フィールドが使用されている子クラスの小文字の名前に置き換えられます。各クラスには異なる名前があるため、関連する各名前は最終的に異なります。

この情報を使用して、m2m フィールドを Base クラスに移動することをお勧めします。

class Content(models.Model):
   # Add remaining fields for Content 
   pass

class Base(models.Model):
   field1 = models.TextField()
   items = models.ManyToManyField(Content,related_name="%(class)s_related")

   class Meta:
      abstract=True

class Child1(Base):
   child1_field = models.TextField()

class Child2(Base):
   child2_field = models.TextField()
于 2009-09-08T17:52:39.887 に答える
2

明らかに、抽象クラスとの ForeignKey リレーション (またはそれについては ManyToMany) は許可されていません。「AssertionError: ForeignKey は抽象クラス Artiest との関係を定義できません」というエラーが表示されます。

可能な解決策は、基本クラスを非抽象として定義することですが、これは、基本クラスのモデルをインスタンス化できることを意味します。これは私が望む動作ではありません.(結局のところ、それは抽象クラスでした)同じ問題に遭遇した人はいますか? 代替案はありますか?

于 2009-09-08T15:10:24.887 に答える
1

一般的な関係を通過するhttp://www.djangoproject.com/documentation/models/generic_relations/をご覧ください。Content モデルは TaggedItem モデルと一致し、Base モデルは Animal/Vegetable/Mineral モデル (Child1 と Child2 を拡張) と一致します。

1 つの子のすべての Content オブジェクトを取得するには、次のようにします (GenericRelation を Base 内のコンテンツに設定すると仮定します)。

child_contents = childObject.contents.all()

モデルのすべての Content オブジェクトを取得するには:

ctype = ContentType.objects.get_for_model(Child1)
all_child_contents = Content.objects.filter(content_type=ctype)
于 2009-09-08T17:30:36.530 に答える