如何使具有额外字段的递归ManyToManyField关系在Django中对称?

2024-06-06 08:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

class Food_Tag(models.Model):
    name = models.CharField(max_length=200)
    related_tags = models.ManyToManyField('self', blank=True, symmetrical=False, through='Tag_Relation')

    def __unicode__(self):
     return self.name

class Tag_Relation(models.Model):
    source = models.ForeignKey(Food_Tag, related_name='source_set')
    target = models.ForeignKey(Food_Tag, related_name='target_set')
    is_a = models.BooleanField(default=False); # True if source is a target
    has_a = models.BooleanField(default=False); # True if source has a target

我想知道食物标签之间的关系,比如:

^{pr2}$

但是相关的_标签是空的。我知道这和“对称=False”的论点有关,但是我怎么能建立这样的模型呢肉类相关标签.all()'返回所有相关的食物标签?在


Tags: nameselffalsetruesourcetargetmodelfood
3条回答

由于您没有明确指出它们需要不对称,所以我建议您首先设置symmetrical=True。正如您所描述的那样,这将导致关系以两种方式工作。正如eternicode所指出的,当您为M2M关系使用through模型时,您不能这样做。如果您可以不使用through模型,那么可以设置symmetrical=True来获得您描述的行为。在

但是,如果它们需要保持不对称,可以将关键字参数related_name="sources"添加到related_tags字段中(您可能需要考虑将其重命名为targets以使事情更清楚),然后使用meat.sources.all()访问相关标记。在

我发现Charles Leifer提出的这个方法似乎是克服Django限制的一个好方法。在

the docs所述:

因此,现在还没有在Django中,可以与额外的字段有一个对称的递归多对多关系。这是一个“二选一”的交易。在

相关问题 更多 >