Django:在ManyToMany关系中突出主要/最喜欢的关系的最佳方式

时间:2014-10-01 00:04:01

标签: django django-models foreign-keys many-to-many

在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给定参考可以参考许多基因,同时仅作为其参考基因的一个的主要参考。

我还应该指出确定"主要"的标准。在这种情况下,引用不是可以根据参考模型中的信息计算的(例如,发布日期)。

1 个答案:

答案 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向关系本身添加“元数据”。