使用ForeignKey与order_by进行排序,但不起作用

时间:2019-03-15 05:35:02

标签: django django-queryset django-orm

我正在尝试按每个Game和最近的title(帖子)对模型update进行排序,而不返回重复项。

views.py

'recent_games': Game.objects.all().order_by('title', '-update__date_published').distinct('title')[:5],

查询中的不同方法可以完美地工作,但是update__date_published似乎不起作用。

models.py

模型-游戏

class Game(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    description = models.TextField()
    date_published = models.DateTimeField(default=timezone.now)
    cover = models.ImageField(upload_to='game_covers')
    cover_display = models.ImageField(default='default.png', upload_to='game_displays')
    developer = models.CharField(max_length=100)
    twitter = models.CharField(max_length=50, default='')
    reddit = models.CharField(max_length=50, default='')
    platform = models.ManyToManyField(Platform)

    def __str__(self):
        return self.title

模型-更新

class Update(models.Model):
    author = models.ForeignKey(User, models.SET_NULL, blank=True, null=True,)  # If user is deleted keep all updates by said user
    article_title = models.CharField(max_length=100, help_text="Use format: Release Notes for MM/DD/YYYY")
    content = models.TextField(help_text="Try to stick with a central theme for your game. Bullet points is the preferred method of posting updates.")
    date_published = models.DateTimeField(db_index=True, default=timezone.now, help_text="Use date of update not current time")
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    article_image = models.ImageField(default='/media/default.png', upload_to='article_pics', help_text="")
    platform = ChainedManyToManyField(
        Platform,
        horizontal=True,
        chained_field="game",
        chained_model_field="game",
        help_text="You must select a game first to autopopulate this field. You can select multiple platforms using Ctrl & Select (PC) or ⌘ & Select (Mac).")

3 个答案:

答案 0 :(得分:0)

请参见distinct参考Examples (those after the first will only work on PostgreSQL)

请参阅此反向查询-See this one for - update__date_published

示例-

Entry.objects.order_by('blog__name', 'mod_date').distinct('blog__name', 'mod_date')

您的查询-

Game.objects.order_by('title', '-update__date_published').distinct('title')[:5]

答案 1 :(得分:0)

您说:

  

-update__date_published似乎不起作用,因为奥运会仅按字母顺序返回。

原因是第一个order_by字段是title;仅当您有多个相同的-update__date_published时,才会出现二级订单字段title,而由于distinct()的缘故,您不会这样做。

如果您希望Game对象通过最新更新而不是其标题来排序,那么从排序中省去title似乎是一个显而易见的解决方案,直到您得到ProgrammingError的{​​{1} }在DISTINCT ON field子句的开头需要field

按最新更新对游戏进行排序的真正解决方案是:

ORDER BY

答案 2 :(得分:-1)

最可能的误解是您的orm查询中的联接。它们通常是延迟加载的,因此date_published字段尚不可用,但是您正在尝试对其进行排序。您需要使用select_related方法来将fk关系作为联接加载。

'recent_games': Game.objects.select_related('update').all().order_by('title', '-update__date_published').distinct('title')[:5]