Python 在django queryset的extra()修饰符中编写正确的SQL查询
我需要帮助为django queryset中使用的额外()修饰符编写一些SQL。陷入优雅的装帧,几次尝试都导致了死胡同。救命啊 背景:我有一个网站,人们在那里提交有趣的URL(在我的models.py中称为Link)。其他用户可以在发布的每个链接下发表评论(在mymodels.py中称为Publicreply) 我想做的是:对于每个用户,我想生成一个查询集- (i) 仅包含用户在下面评论的链接 (ii)按每个链接下最新评论的时间戳排序。例如,如果一个链接有多个注释,我希望最近的注释的时间戳对查询集中的所述链接进行排序。请注意,此评论可以来自任何人(不一定来自用户本人) 下面是一些简单的代码,直接从我的视图.py:Python 在django queryset的extra()修饰符中编写正确的SQL查询,python,sql,django,postgresql,django-queryset,Python,Sql,Django,Postgresql,Django Queryset,我需要帮助为django queryset中使用的额外()修饰符编写一些SQL。陷入优雅的装帧,几次尝试都导致了死胡同。救命啊 背景:我有一个网站,人们在那里提交有趣的URL(在我的models.py中称为Link)。其他用户可以在发布的每个链接下发表评论(在mymodels.py中称为Publicreply) 我想做的是:对于每个用户,我想生成一个查询集- (i) 仅包含用户在下面评论的链接 (ii)按每个链接下最新评论的时间戳排序。例如,如果一个链接有多个注释,我希望最近的注释的时间戳对查询
class UserActivityView(ListView):
model = Link
slug_field = "username"
template_name = "user_activity.html"
paginate_by = 10
def get_queryset(self):
comments_by_user = Publicreply.objects.filter(submitter=user)
links_with_comments = [reply.answer_to.id for reply in replies_by_user.iterator()]
qset = Link.objects.filter(id__in=links_with_comments).extra(select={'submitted_on':"SELECT max('submitted_on') FROM 'links_publicreply' WHERE 'links_publicreply.answer_to' = 'links_link.id'"})
return qset
和型号。py包含:
class Publicreply(models.Model):
submitter = models.ForeignKey(User)
answer_to = models.ForeignKey(Link)
submitted_on = models.DateTimeField(auto_now_add=True)
description = models.TextField(validators=[MaxLengthValidator(250)])
class Link(models.Model):
submitter = models.ForeignKey(User)
submitted_on = models.DateTimeField(auto_now_add=True)
url = models.URLField(max_length=250)
我在get\u queryset()
方法下的extra()
视图.py中的modifier中编写的SQL没有给出所需的结果(我得到的是None
)。请注意,我试图使用extra()
修饰符将publicreply
实例的最新时间戳附加到其相关的链接
。稍后,我将根据所述时间戳对查询集进行排序
请在extra()
修饰符中帮助制定正确的SQL。我使用Django 1.5和Python2.7。谢谢。这似乎与extra
或者SQL没有任何关系;问题完全在于Python语法。你希望(在链接中加入带有注释的链接)
做什么?嘿,丹尼尔Link.objects.filter(id\uu in=links\u with\u comments)
为我提供用户发表评论的所有链接。此类注释由models.py中的class Publicreply
表示,具有时间戳(即submitted\u on
)。我需要附加到每个链接,最新的公开答复的时间戳。无论您在extra()
中看到什么,都是我试图获取最近的时间戳。使用(links in links\u With\u comment)
,我试图引用publicreplies与之有外键关系的链接。@DanielRoseman:您建议我如何做?使用extra()
将代码行更改为link.objects.filter(id\u in=links\u With\u comments)。额外(选择={'submitted\u on':“选择max('submitted\u on'))从“links\u publicreply”中的“links\u publicreply.answer”到“='links\u link.id'”)
我觉得我离这更近了一步,但奇怪的是,额外的()部分返回了None
。我发现annotate()工作得更好这似乎与extra
或者SQL没有任何关系;问题完全在于Python语法。你希望(在链接中加入带有注释的链接)
做什么?嘿,丹尼尔Link.objects.filter(id\uu in=links\u with\u comments)
为我提供用户发表评论的所有链接。此类注释由models.py中的class Publicreply
表示,具有时间戳(即submitted\u on
)。我需要附加到每个链接,最新的公开答复的时间戳。无论您在extra()
中看到什么,都是我试图获取最近的时间戳。使用(links in links\u With\u comment)
,我试图引用publicreplies与之有外键关系的链接。@DanielRoseman:您建议我如何做?使用extra()
将代码行更改为link.objects.filter(id\u in=links\u With\u comments)。额外(选择={'submitted\u on':“选择max('submitted\u on'))从“links\u publicreply”中的“links\u publicreply.answer”到“='links\u link.id'”})
我觉得我离这更近了一步,但奇怪的是额外的()部分返回了None
。我发现annotate()效果更好