Django queryset extra query中的语法错误

2024-09-28 16:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

以下内容包含语法错误:

date = datetime.now()-timedelta(minutes=30)
articles = Article.objects.filter(published=True).extra(select = {
  "views" : """
  SELECT COUNT(*)
  FROM myapp_readership
    JOIN myapp_article on myapp_readership.which_article_id = myapp_article.id
  WHERE myapp_readership.reader_id = myapp_user.id
  AND myapp_readership.what_time > %s """ % date,
}).order_by("-views")

错误是:语法错误在“01”附近(其中“01”是extra中的datetime对象)。没什么好谈的。有人能指出发生了什么事吗?在


背景:与上述代码相关的模型为:

^{pr2}$

我写上面的代码是因为我试图获取所有已发表的文章,并按过去30分钟内每篇文章的独特读者群进行排序。一、 e.计算每一篇发表的文章在过去的半小时内有多少不同的(独特的)观点,然后根据这些不同的观点产生一个文章列表。我的代码缺少处理需求的“distinct”部分-我不知道如何在这里完成这一点。在


Tags: 代码iddatetimedatearticle文章extramyapp
1条回答
网友
1楼 · 发布于 2024-09-28 16:18:41

永远不要在SQL查询中使用字符串替换,不管它是否是extra调用的一部分。您已经发现了一个原因,因为没有正确地引用值,但更重要的原因是它使您对SQL注入保持开放。在

相反,请使用db api提供的工具:在本例中,使用select_params

.extra(
  select={
    "views" : """
      SELECT COUNT(*)
      FROM myapp_readership
        JOIN myapp_article on myapp_readership.which_article_id = myapp_article.id
      WHERE myapp_readership.reader_id = myapp_user.id
      AND myapp_readership.what_time > %s """
    },
    select_params=(date,),
)

另请参见注释in the docsextra方法已被弃用,查询当然可以用其他ORM方法表示。在

相关问题 更多 >