I have two models - Project and Contract.
They have one-to-many relationship.

class Contract(models.Model):
    project = models.ForeignKey(Project)

我得到了一个Project个实例的qs与相关的Contract个实例.

projects = Project.objects.filter(active=True).prefetch_related(
        Prefetch('contract_set', queryset=Contract.objects.filter(**filters), to_attr='contracts')
    )

但现在我需要通过将Contract GUID放置到filters来获得Project个实例.

filters: Dict = {
  'guid': some_guid,
}

但我收到了所有Project个实例,其中只有一个实例没有空contracts attr,其他Project个实例有空contracts attr.

I found such issues:
How to exclude rows with empty prefetch_related field
Filter prefetch_related empty in django
but they do not help me.

I tried such options:
a) using OuterRef and Exist:

projects = Project.objects.filter(**filters_projects).annotate(
    has_contracts=Exists(
        Contract.objects.filter(project_id=OuterRef('pk'), **filters_contracts)
    )
)

projects = projects.filter(has_contracts=True)

b)使用annotate:

projects = (
        Project.objects.filter(**filters_projects)
        .annotate(num_contracts=Count('contract'))
        .exclude(num_contracts=0)
        .prefetch_related(
            Prefetch('contract_set', queryset=Contract.objects.filter(**filters_contracts), to_attr='contracts')
        )
    )

他们不为我工作…

如何实现所需的功能?

推荐答案

你需要过滤Prefetch对象andProject,所以:

projects = (
    Project.objects.filter(
        Exists(
            Contract.objects.filter(
                project_id=OuterRef('pk'), **filters_contracts
            )
        ),
        **filters_projects
    )
    .prefetch_related(
        Prefetch(
            'contract_set',
            queryset=Contract.objects.filter(**filters_contracts),
            to_attr='contracts',
        )
    )
    .distinct()
)

因此,您使用**filters_contracts两次:一次仅检索一次Project,一次用于预取对象.

Python相关问答推荐

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

仿制药的类型铸造

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

在Python中处理大量CSV文件中的数据

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

Python,Fitting into a System of Equations

当点击tkinter菜单而不是菜单选项时,如何执行命令?

多指标不同顺序串联大Pandas 模型

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

替换现有列名中的字符,而不创建新列

干燥化与列姆化的比较

将一个双框爆炸到另一个双框的范围内

比较两个有条件的数据帧并删除所有不合格的数据帧

#将多条一维曲线计算成其二维数组(图像)表示

如何在Python中画一个只能在对角线内裁剪的圆?

将索引表转换为Numy数组

Django REST框架+Django Channel->;[Errno 111]连接调用失败(';127.0.0.1';,6379)

生产者/消费者-Queue.get by list

如何在微调Whisper模型时更改数据集?

401使用有效的OAuth令牌向Google Apps脚本Web App发出POST请求时出现未经授权的错误(";