【问题标题】:How do I write a Django ORM query where the select table shares a common column with another table?如何编写一个 Django ORM 查询,其中选择表与另一个表共享一个公共列?
【发布时间】:2019-01-21 21:42:10
【问题描述】:

我正在使用 Django 和 Python 3.7。我有这两个模型。请注意,它们都有相似的字段

class Article(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE,)


class WebPageStat(models.Model):
    objects = WebPageStatManager()
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, )
    score = models.BigIntegerField(default=0)

我想编写一个 Django ORM 查询,该查询选择其中一个模型,但在共享列上进行连接,以便对“分数”字段进行比较。我尝试了以下方法,但是错误

Article.objects.filter(publisher=webpagestat.publisher, webpagestat.score__gte==100)
  File "<input>", line 1
SyntaxError: positional argument follows keyword argument

如何在我的联接中包含“WebPageStat”表?

【问题讨论】:

标签: python django python-3.x join orm


【解决方案1】:

在 Django 中使用lookups that span relations 可以轻松完成您想要的操作。在您的示例中,您需要添加一种引用 ORM 中相关对象的方法。这是通过设置ForeignKey 字段的related_name 属性来实现的。虽然这不是绝对必要的,但以这种方式更清楚。您可以阅读有关related_name and related_query_name here 的更多信息。简而言之,您的模型应该如下所示:

class Article(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='articles')


class WebPageStat(models.Model):
    objects = WebPageStatManager()
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='stats')
    score = models.BigIntegerField(default=0)

完成后,您的查询将通过以下代码执行:

Article.objects.filter(publisher__stats__score__gte=100)

简而言之,此查询所做的就是选择发布者至少有一个网页统计信息得分大于或等于 100 的每篇文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多