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 模型分成两个模型并创建一个 OneToOneField 到另一个。这样,结构就变成了树而不是网。下面的代码说明了我的观点:

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 回答