Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:如何向后跟随许多人(自我)_Django_Django Models_Many To Many - Fatal编程技术网

Django:如何向后跟随许多人(自我)

Django:如何向后跟随许多人(自我),django,django-models,many-to-many,Django,Django Models,Many To Many,我可以做到: class c(models.Model): f = models.ManyToManyField( 'self', blank=True, null=True, related_name='child_set' ) 但是我怎么才能过得去呢 c.objects.get(pk="1").f 不起作用 我需要这个: c.objects.get(pk="1").child_set 对于引用se

我可以做到:

class c(models.Model):
    f = models.ManyToManyField(
        'self', 
        blank=True, 
        null=True, 
        related_name='child_set'
    )
但是我怎么才能过得去呢

 c.objects.get(pk="1").f
不起作用

我需要这个:

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

对于引用
self
ManyToManyField
s,不会创建反向关系。这是因为它没有用处——它将包含所有引用自身的关系——这就是向前关系所做的

您将发现,无论您说什么,
相关的\u名称
都应设置为
%(字段)s\u rel
(尾随的
+
阻止创建关系)


因此,答案是没有
子集合
,因为您可以只使用
f

一个很好的解决方案是将C模型分成两个模型,并创建一个一个到另一个的OneToOneField。这样,结构就变成了一棵树而不是一个web。下面的代码说明了我的观点:

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

C.parent.all() == [A,B]
A.parent_set.all() == [B,C]
现在您可以执行以下操作:

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'
    )
然后,您可以通过以下方式获得“_set”:

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

Django的ManyToManyField默认情况下是对称的。这意味着将以两种方式创建直通模型。如果你指向self,这意味着没有相反的关系,因为主关系包括两者

可以通过禁用对称来更改此行为。有一个关键字参数来执行该调用
symmetric
。在您的示例中:

Coo.objects.get(pk=1).boo.child_set

instance.f
已经是一个集合了-为什么需要
instance.child\u set
?哦,我应该提到,您可以使用
c检查相关名称(出于此目的,而不是用于生产)。\u meta.get\u field\u by\u name('f')[0]。相关的\u query\u name()
感谢您的关注:)我想构建一个树结构,每个节点都应该注册从根节点到其位置的路径(对于长度超过一个的路径,需要M2M)。我想通过c.child_集和c.f到达特定节点的所有父节点(路径),到达连接到特定父节点的所有子节点。根据此定义,“父节点”或“子节点”都不是“父节点”或“子节点”-它们更像“兄弟姐妹这种多对多结构更像是一张网而不是一棵树。对于树结构,每个节点只能有一个父节点,因此您可以使用
ForeignKey
relationship.thnx:)在Django中,我必须使用FKey,但在SQLAlchemy中,它很简单:这只是答案的一半,可以禁用多个关系对称。这将带来相反的关系。见下面我的答案。
class c(models.Model):
f = models.ManyToManyField(
    'self', 
    blank=True, 
    null=True, 
    related_name='child_set',
    symmetrical=False
)