【问题标题】:django: How to order the queryset on a field in ManyToManyField (through) related modelsdjango:如何在 ManyToManyField(通过)相关模型中的字段上对查询集进行排序
【发布时间】:2011-11-11 21:38:20
【问题描述】:

我有这些模型

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

假设我有三个区域,即欧洲、南亚和北亚

现在我想在欧洲地区按“digital_release_date”获取所有“已发布”专辑的顺序?

谁能告诉我如何通过 SQL 查询来做到这一点?

谢谢:)

【问题讨论】:

  • 在方法/函数调用和类定义中,括号前后有空格通常不会在 python 中完成。这是合法的,但非常不标准。 (链接到 PEP...)

标签: python sql django many-to-many django-queryset


【解决方案1】:

编辑

对不起,我的错!现在这应该可以了。我在家里试过...

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

Here 对未来的疑惑有所帮助

希望现在可以使用!

【讨论】:

  • 你不能这样做digital_release_date__digital_release_date它会抛出FieldError,因为模型digital_release_date中的Album指向模型Region
  • 对不起!我的错误......现在试试。它应该工作!或尝试@DiegoNavarro 选项,但使用我推荐的字段名称(您放入related_name 参数的名称)
【解决方案2】:

我认为你可以这样做:

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

【讨论】:

  • 你无法从区域获取专辑,彼此之间没有链接AttributeError: 'Region' object has no attribute 'album_set'
  • 是的,你可以。也许用不同的名字。尝试 dir(region_object) 看看你有什么。你会发现类似 _set 的东西。您可以通过两种方式(直接和反向)处理关系。
  • album_set 不起作用。如果他没有重命名关系,那么albumregionreleasedate_set 可能会起作用。但是如果您查看该字段的定义,您将看到一个 related_name 参数。这是从相关对象中使用的名称。所以在你的例子中将是Region.objects.get(name='Europe').release_date_albums.filter(published=True).order_by('digital_release_date')
  • 我认为值得一提的是这种方法适用于对象实例,而不是 QuerySet。 QuerySet 也会抛出 AttributeError
【解决方案3】:

好吧,既然您使用的是 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')

如果您只需要一个查询,而不使用默认排序,...我将不得不考虑更多。

【讨论】:

  • 感谢回复,但我想要一个查询来执行此操作,因为我希望将区域输入到该查询
  • 我想要这样的东西 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]) 这里 store 是我的应用名称。
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 2014-05-17
  • 2020-05-10
  • 2021-03-20
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多