2011-09-07 75 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

相关问题