2014-10-01 105 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