4
class c(models.Model):
    f = models.ManyToManyField(
        'self', 
        blank=True, 
        null=True, 
        related_name='child_set'
    )

できます :

 c.objects.get(pk="1").f

しかし、どうすれば'_set'を取得できますか?

 c.objects.get(pk="1").child_set

動作しません

私はこれを必要とする:

{name:A,parent:[]}
{name:B,parent:[A]}
{name:C,parent:[A,B]}

C.parent.all() == [A,B]
A.parent_set.all() == [B,C]
4

3 に答える 3

2

DjangoのManyToManyFieldは、デフォルトで対称です。つまり、スルーモデルは両方の方法で作成されます。あなたが自己を指している場合、これは、メインの関係には両方が含まれているため、逆の関係がないことを意味します。

この動作は、対称性を無効にすることで変更できます。その呼び出しを行うためのキーワード引数がありますsymmetrical。あなたの例では:

class c(models.Model):
f = models.ManyToManyField(
    'self', 
    blank=True, 
    null=True, 
    related_name='child_set',
    symmetrical=False
)
于 2018-10-19T14:09:57.640 に答える
1

ManyToManyFieldを参照するsの場合self、逆の関係は作成されません。これは、それ自体を参照するすべての関係が含まれるため、使用がないためです。これは、転送関係が行うことです。

あなたが何を言おうと、related_nameそれが設定されるべきであることに関係なくあなたは見つけるでしょう%(field)s_rel_+(末尾+は関係が作成されるのを防ぎます)。

だから答えはchild_setあなたがただ使うことができるのでありませんf

于 2013-01-09T05:01:09.970 に答える
0

このための良い解決策は、Cモデルを2つのモデルに分割し、もう一方のモデルにOneToOneFieldを作成することです。このようにして、構造はWebではなくツリーになります。以下のコードは私のポイントを示しています:

class Boo(models.Model):
    name = models.CharField(max_length=20)

class Coo(models.Model):
    boo = models.OneToOneField(Boo)
    foo = models.ManyToManyField(
          Boo, 
          blank=True, 
          null=True, 
          related_name='child_set'
    )

今、あなたはすることができます:

Coo.objects.get(pk=1).foo

そして、次のように「_set」で取得できます。

Coo.objects.get(pk=1).boo.child_set
于 2015-05-24T14:20:03.477 に答える