django:如何在ManyToManyField(通过)关联模型的字段上排序查询集

5 投票
3 回答
1969 浏览
提问于 2025-04-17 01:39

我有这些模型

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')

假设我有三个地区:欧洲、南亚和北亚。

现在我想在欧洲地区获取所有“已发布”的专辑,并按“数字发行日期”排序,应该怎么做呢?

有没有人能告诉我怎么用SQL查询来实现这个?

谢谢 :)

3 个回答

0

我觉得你可以这样做:

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

好吧,因为你在用Django的ORM,所以你可能不想直接用SQL查询来做这件事。

如果你总是想按照某种顺序来排列这些数据(默认情况下),我觉得最好的办法是在你的中间模型的Meta内部类里加一个排序属性:

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

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

如果你只想用一个查询来实现这个,而不使用默认的排序……我还需要再想想。

5

编辑:

抱歉,我搞错了!现在这个应该可以用了。我在家试过了……

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

这里

希望这次能成功!

撰写回答