在django中强调ManyToMany关系中特定关系的最佳方法是什么?
例如,如果我想突出显示主要或其他"最佳"参考基因数据库中的基因,我目前的策略(似乎有点错误和重复)是除了ManyToManyField之外还使用外键:
from django.db import models
class Gene(models.Model):
name = models.CharField()
primary_reference = models.ForeignKey(Reference)
other_references = models.ManyToManyField(Reference) # doesn't include primary
class Reference(models.Model):
year = models.CharField()
author = models.CharField()
这可以完成工作,但现在如果我想获得所有引用,我就不能得到gene.references
...(相反,我需要连接primary_references
和{{ 1}})
另一方面,如果我只是制作一个ManyToManyField字段
other_references
获取类似class Gene(models.Model):
name = models.CharField()
referencess = models.ManyToManyField(Reference) # includes primary
(反之,gene.primary_reference
,排除主要内容)的最佳方式是什么?
我想在Reference模型中有一个额外的字段,其中包含一个布尔值,用于"主要参考" ...但这不起作用,因为作为我案例的附加说明:a给定参考可以参考许多基因,同时仅作为其参考基因的一个的主要参考。
我还应该指出确定"主要"的标准。在这种情况下,引用不是可以根据参考模型中的信息计算的(例如,发布日期)。
答案 0 :(得分:2)
你如何做到这一点很好,我唯一要改变的是有两个字段:references
(对于所有引用)和primary_reference
。例如:
class Gene(models.Model):
name = models.CharField()
primary_reference = models.ForeignKey(Reference, related_name="primary_reference")
references = models.ManyToManyField(Reference)
class Reference(models.Model):
year = models.CharField()
author = models.CharField()
如果只想查询非主要引用,则可以构建如下查询:
gene.references.exclude(id=gene.primary_reference_id)
如果可以有多个primary_reference
,那么您将希望使用Django's related_through
feature向关系本身添加“元数据”。