2016-12-14 123 views
0
「第一」查找

比方說,我們有兩個型號這樣的:Django的過濾器對很多一對多的關係

Artist(models.Model): 
    name = models.CharField(max_length=50) 

Track(models.Model): 
    title = models.CharField(max_length=50) 
    artist = models.ForeignKey(Artist, related_name='tracks') 

如何過濾這種關係得到第一個外國記錄?

所以我已經試過這樣的事情,但它沒有工作(如預期)

artists = Artist.objects.filter(tracks__first__title=<some-title>) 
artists = Artist.objects.filter(tracks[0]__title=<some-title>) 

有什麼辦法,使這項工作?

+0

如果你想其中一個軌道具有多個藝術家的場景模式,我建議改變模型和關係。 使用當前技術,您可以存儲同一個Artist的多個曲目的數據。 –

+0

不是真的..我只是希望能夠在MANY_TO_MANY關係僅過濾第一個記錄而不是所有的人都 – intelis

+0

確定。很簡單。 你想要藝術家,給定一個曲目標題: Artist.objects.filter(tracks__title = )[0] 這會給你第一行(按插入順序排列) –

回答

1

這裏有一個解決方案未服用性能的考慮。

Artist.objects.filter(tracks__in=[a.tracks.first() for a in Artist.objects.all()], tracks__title=<some_title>) 

根據要求沒有列表方法。

Artist.objects.filter(tracks__in=Track.objects.all().distinct('artist').order_by('artist', 'id'), tracks__title=<some_title>) 

order_by'id'對於確保不同基於插入獲取第一條曲目很重要。 order_by'藝術家'是排序不同查詢的要求。閱讀在這裏:https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-DISTINCT

+0

感謝您的更新,但這是一種非常低效的方式,因爲列表存儲在內存中。 – intelis

+0

@intelis刪除了列表。請讓我知道這對你有沒有用。 –