Python 引用django模型查询的两次相关字段

Python 引用django模型查询的两次相关字段,python,django,django-models,Python,Django,Django Models,因此,我使用Django构建了一个查询,我定义了3个模型: class Book(models.Model): ... class Upload(models.Model): ... book = models.ForeignKey(Book, on_delete=models.CASCADE) class Region(models.Model): ... page = models.ForeignKey(Upload, on_delete=mo

因此,我使用Django构建了一个查询,我定义了3个模型:

class Book(models.Model):
    ...


class Upload(models.Model):
    ...
    book = models.ForeignKey(Book, on_delete=models.CASCADE)


class Region(models.Model):
    ...
    page = models.ForeignKey(Upload, on_delete=models.CASCADE)
考虑到这3个模型,我需要一个查询,列出所有书籍,并用一个分段页面变量对它们进行注释,该变量包含具有非零区域数的所有上传的计数

基本上,计算至少有一个区域的每本书的上载数量

我假设查询的基本结构是这样的,主要是过滤器内部的逻辑需要修改,因为没有方便的计数查找

Book.objects.annotate(segmented_pages=Count('upload', filter=Q(upload__region__count__gt=0))            
有人可以帮助我了解过滤器的逻辑,并简单解释如何使用django模型设计这些类型的查询吗?

您可以将“非零区域数”重写为“在查询生成的联接中,任何上载的区域不得为
null
”,因此您可以简单地使用:


谢谢!这正是我要找的。。再好奇一点,这只在非零或空区域的情况下有效,你会如何修改它以适用于一些通用的东西,例如区域数应该大于3?@Krishna,该查询将更复杂,必须使用子查询,甚至可能需要自定义表达式。是的,我想到了!不管怎么说,没关系,也许我会在以后的某个时候发布另一个问题。。
from django.db.models import Count, Q


Book.objects.annotate(
    segmented_pages=Count(
        'upload',
        filter=Q(upload__region__isnull=False),
        distinct=True
    )
)