Python 在django queryset的extra()修饰符中编写正确的SQL查询

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)按每个链接下最新评论的时间戳排序。例如,如果一个链接有多个注释,我希望最近的注释的时间戳对查询

我需要帮助为django queryset中使用的额外()修饰符编写一些SQL。陷入优雅的装帧,几次尝试都导致了死胡同。救命啊

背景:我有一个网站,人们在那里提交有趣的URL(在我的models.py中称为Link)。其他用户可以在发布的每个链接下发表评论(在mymodels.py中称为Publicreply)

我想做的是:对于每个用户,我想生成一个查询集-

(i) 仅包含用户在下面评论的链接

(ii)按每个链接下最新评论的时间戳排序。例如,如果一个链接有多个注释,我希望最近的注释的时间戳对查询集中的所述链接进行排序。请注意,此评论可以来自任何人(不一定来自用户本人)

下面是一些简单的代码,直接从我的视图.py

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()效果更好