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
)