繁体   English   中英

如何编写Django ORM查询,其中选择表与另一个表共享公共列?

[英]How do I write a Django ORM query where the select table shares a common column with another table?

我正在使用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”表?

通过使用跨越关系的查找,可以轻松地在Django中完成所需的操作。 在您的示例中,您需要添加一种在ORM中引用相关对象的方法。 这是通过设置在东德related_name的属性ForeignKey领域。 尽管这不是严格必需的,但以这种方式更加清楚。 您可以在此处了解有关related_namerelated_query_name更多信息。 简而言之,您的模型应如下所示:

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的网页状态的每篇文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM