2011-09-07 71 views
4

我有這些模型Django的:如何訂購查詢集上的場ManyToManyField(通過)相關的模型

class Region (models.Model): 
    name = models.CharField (max_length = 255, blank = False) 

class Album(TimeStampAwareModel): 
    title = models.CharField (max_length = 255, blank = False) 
    digital_release_date = models.ManyToManyField(Region, through="AlbumRegionReleaseDate", related_name="release_date_albums") 
    published = models.BooleanField (default = False) 
    . 
    . 

class AlbumRegionReleaseDate(models.Model): 
    album = models.ForeignKey (Album) 
    region = models.ForeignKey (Region) 
    digital_release_date = models.DateField() 
    class Meta: 
    ordering = ('-digital_release_date') 

假設我有三個區域I:E歐洲,南亞和北亞

現在,我想通過歐洲地區的「digital_release_date」訂購所有「已發佈」專輯嗎?

任何人都可以請告訴我如何通過SQL查詢做到這一點?

謝謝:)

+1

在方法/函數調用和類定義中的括號之前和之後具有空格通常不會在python中完成。這是合法的,但非常不規範。 (鏈接到PEP ...) –

回答

4

編輯

對不起,我的錯!現在這應該工作。我試了一下在家裏......

Album.objects.filter(
    published=True, 
    albumregionreleasedate__region__name='Europe' 
).order_by(
    'albumregionreleasedate__digital_release_date' 
) 

Here對未來的一些幫助懷疑

希望工程吧!

+0

你不能這樣做'digital_release_date__digital_release_date'它拋出'因爲模型'Album'中的'digital_release_date'指向模型'Region',因此FieldError'。 – Ahsan

+0

對不起!我的錯誤...現在嘗試。它應該工作!或者嘗試使用@DiegoNavarro選項,但使用我推薦的字段名稱(您輸入到related_name參數的名稱) – marianobianchi

0

好吧,既然你正在使用Django的ORM,你可能不希望「通過SQL查詢」來做到這一點。

如果你總是想訂購他們(默認),這樣一來,我想最好的解決辦法是通過模型元內部類把排序屬性您:

class AlbumRegionReleaseDate(models.Model): 
    album = models.ForeignKey(Album) 
    region = models.ForeignKey(Region) 
    digital_release_date = models.DateField() 

    class Meta: 
     ordering = ('region', 'digital_release_date') 

如果你只想一個查詢可以做到這一點,而不需要使用默認排序,...我必須考慮更多。

+0

感謝回覆,但我想要一個查詢來做到這一點,因爲我想區域被輸入到該查詢 – Ahsan

+0

我想要這樣的'Album.objects.raw('SELECT store_album。*, t2.digital_release_date FROM store_album,(SELECT * FROM store_albumregionreleasedate t1 WHERE t1.region_id =%s)AS t2 WHERE store_album.id = t2.album_id ORDER BY t2.digital_release_date',[r1.id])'這裏的商店是我的應用程序名稱。 – Ahsan

0

我認爲你可以這樣做:

Region.objects.get(name='Europe').album_set.filter(published=True).order_by('digital_release_date') 
+0

你不能從地區獲得專輯,相互之間沒有鏈接** AttributeError:'地區'對象沒有屬性'album_set'** – Ahsan

+0

是的,你可以。也許用不同的名字。嘗試dir(region_object),看看你有什麼。你會發現像 _set。你可以通過兩種方式(直接和反向)進行關係。 –

+0

'album_set'不起作用。如果他沒有重新命名關係,那麼可以做些什麼是'albumregionreleasedate_set'。但是,如果您查看該字段的定義,則會看到一個related_name參數。這是相關對象使用的名稱。所以在你的例子中將'Region.objects.get(name ='Europe')。release_date_albums.filter(published = True).order_by('digital_release_date') ' – marianobianchi

相關問題