如何使用 Django Querysets 和 Q() 与相同模型类型的对象进行比较?

Posted

技术标签:

【中文标题】如何使用 Django Querysets 和 Q() 与相同模型类型的对象进行比较?【英文标题】:How can I use Django Querysets and Q() to compare against objects of the same model type? 【发布时间】:2014-01-16 08:10:46 【问题描述】:

我有一个名为 MyModel 的 Django 模型。 m 是 MyModel 的一个实例。 我想使用 Django QuerySets 来查找所有不是 m 的 MyModel 实例。 怎么做?这不起作用:

MyModel.objects.filter(~Q(m))

您似乎可以使用 Q() 查询 MyModel 的属性。但是,我不知道如何使用 Q 来包含/排除 MyModel 本身的实例。这是可行的吗?如果是这样,怎么做?如果没有,什么是最有效和最优雅的方式来完成我正在尝试做的事情?

【问题讨论】:

【参考方案1】:

使用模型的pk(主键)字段:

MyModel.objects.exclude(pk=m.pk)

要排除另一个模型n(在下面的评论中提出其他问题),您可以这样做:

MyModel.objects.exclude(pk=m.pk).exclude(pk=n.pk)

更一般地说,要排除 list_of_instances 的实例列表,请使用 __in 语法:

MyModel.objects.exclude(pk__in=[instance.pk for instance in list_of_instances])

【讨论】:

@SaqibAli -- 查看修改后的答案

以上是关于如何使用 Django Querysets 和 Q() 与相同模型类型的对象进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试 Django QuerySets 是不是相等?

Django QuerySets - 如何注释一个字段但返回另一个字段?

有没有办法在 Django Querysets 中组合注释和过滤聚合?

使用 Django QuerySets 时使用列表推导而不是 for 循环

python Django:QuerySets

Django Querysets - 添加字符串文字注释