2014-05-03 69 views
0

我有兩個類 - Arzt和Fachbereich - 通過ArztFachbereich通過ManyToMany關係相關。通過特定的ManyToMany對象來訂購Django QuerySet

class Fachbereich(FachbereichUndArztFachbereiche): 
    name = models.CharField(unique=True, max_length=100) 

class Arzt(models.Model): 
    name = models.CharField(max_length=500) 
    fachbereich = models.ManyToManyField(Fachbereich, through="ArztFachbereich") 

class ArztFachbereich(FachbereichUndArztFachbereiche): 
    arzt = models.ForeignKey(Arzt) 
    fachbereich = models.ForeignKey(Fachbereich) 
    note = models.FloatField() 

我知道如何才能得到由Arzt的最小音符排序的結果。

Arzt.objects.annotate(best_note=Min("arztfachbereich__note")).order_by("best_note") 

但接下來我先用Fachbereich-ID(fb_id)過濾Arzt。而現在我不需要最小的音符或聚合的東西,但這個具體的ArztFachbereich的說明。

澄清我在說什麼: 這樣的事情......但我不知道如何在django中做到這一點。

aerzte = Arzt.objects.filter(fachbereich=fb_id) 
aerzte.order_by("arztfachbereich__note" 
       WHERE arztfachbereich__fachbereich == 
       Fachbereich.objects.get(id=fb_id)) 

或者另一種方式我想過:

aerzte = Arzt.objects.filter(fachbereich=fb_id) 
aerzte.annotate(specific=ArztFachbereich.objects.get(arzt=self, fachbereich__id=fb_id) 
aerzte.order_by("specific") 

但我顯然不能訪​​問arzt機智的自我聲明...

回答

2

如果我理解正確的話,這應該工作:

Arzt.objects.filter(arztfachbereich__fachbereich_id=fb_id) 
      .order_by("arztfachbereich__note") 

對此關係的任何疑問將在ArztFachbereich上運行表(根據查詢,可能JOIN編輯到ArztFachbereich表)。這裏,filter()將與SQL WHERE子句對應,該子句將行限制爲具體值fachbereich_id,然後order_by將其餘行按note值排序。

我覺得你的困惑來自我們正在查詢Artz模型的事實。這是否更有意義:ArztFachbereich.objects.filter(fachbereich_id=fb_id).order_by("note")?這兩條語句基本上是等價的,但在Artz上過濾可讓您以Artz對象而不是ArztFachbereich對象結束。

(如果不是的情況下artzfachbereichunique_together,你也需要把distinct()在查詢結束,以確保你不會在你的最終查詢組副本Artz情況下結束了。)

+0

似乎工作......但我不明白爲什麼^^我正在過濾Arzt,但可以訪問特定ArztFachbereich對象的arztfachbereich__note ...? – Sehebo

+0

@Sehebo:我更新了答案,試圖使其更加清晰。 –