我正在尝试按每个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).")
答案 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]