2014-10-01 106 views
0

突出显示django中的ManyToMany关系中的特定关系的最佳方式是什么?例如,如果我想强调基因数据库中基因的主要或其他“最佳”参考,我目前的策略(似乎有些错误和重复)是除了使用外键ManyToManyField:Django:在ManyToMany关系中突出显示主/关系关系的最佳方式

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_referencesother_references

另一方面,如果我只是制作一个ManyToManyField字段

class Gene(models.Model): 
    name = models.CharField() 
    referencess = models.ManyToManyField(Reference) # includes primary 

是什么让像gene.primary_reference(相反,gene.other_references,不包括主)的最好方法?

我想在参考模型中有一个额外的字段,其中有一个类似于“主参考”的布尔值......但这不起作用,因为作为我的情况的附加说明:给定的参考可以引用多个多个基因,同时仅作为其参考基因的一个的主要参考。

我还应该指出,在这种情况下确定“主要”参考的标准并不是可以从参考模型中的信息计算出来的(例如发布日期等)。

+0

primary_reference是否应该是一个单一的ForeignKey,就像你在代码示例中一样?如果是这样,你在这里有什么是好的,如果你只是寻找非主要引用,排除单个引用不应该太难。如果有多个主要参考的可能性,那么这是一个不同的问题(通过'related_through'回答)。 – michaelb 2014-10-01 00:09:33

+0

是的,只会有一个primary_reference。因此,将ForeignKey和ManyToMany关系同一个模型不认为是不好的做法?最好的方式来得到所有的参考文件是 '@property def all_references:'? – tlambert 2014-10-01 00:12:58

+0

就我个人而言,我有'ManyToMany'指向所有引用,包括主要引用。如果你只想*非主要引用,那么你可以像这样构造一个查询:'gene.references.exclude(id = gene.primary_reference_id)' – michaelb 2014-10-01 00:25:48

回答

2

你怎么样都没问题,唯一改变的是有两个字段:references(所有参考文献)和primary_reference。例如:

​​

如果您想查询只非主引用,则可以构建这样的查询:

gene.references.exclude(id=gene.primary_reference_id) 

如果可以有多个primary_reference那么你会想要使用Django's related_through feature从本质上为关系本身添加“元数据”。

+0

如果我可能会问一个相关的问题:如果基因 - >引用是一个OneToMany引用(每个引用指的是一个且只有一个基因)会怎么样?这将设置一个互惠外键的情况......其中'类Gene'具有'ForeignKey(引用)'且'类引用'具有'ForeignKey(基因)'......这是可以接受的吗?有更好的策略吗? – tlambert 2014-10-04 01:53:08