Django对同一个外键对象的两个字段进行过滤

提姆

我有一个与此类似的数据库架构:

class User(models.Model):
    … (Some fields irrelevant for this query)

class UserNotifiy(models.Model):
    user = models.ForeignKey(User)
    target = models.ForeignKey(<Some other Model>)
    notification_level = models.SmallPositivIntegerField(choices=(1,2,3))

现在,我要查询具有特定目标和至少特定通知级别(例如2)的UserNotify对象的所有用户。

如果我做这样的事情:

User.objects.filter(usernotify__target=desired_target,
    usernotify__notification_level__gte=2)

我得到所有具有指定目标的UserNotify对象和至少一个Notification_level大于或等于2的UserNotify对象的所有Users。但是,这两个UserNotify对象不必相同。

我知道我可以做这样的事情:

user_ids = UserNotify.objects.filter(target=desired_target,
    notification_level__gte=2).values_list('user_id', flat=True)
users = User.objects.filter(id__in=user_ids).distinct()

但这对我来说似乎太过分了,我相信它会执行两个查询。

有没有一种方法可以通过单个查询解决我的问题?

Trecouvr

我一直在寻找这种行为,但从未找到比您描述的更好的方法(创建一个查询用户ID并将其注入到User查询中)。请注意,这还不错,因为如果您的数据库支持子查询,则您的代码应仅触发由一个查询和一个子查询组成的一个请求。

但是,如果您只需要User对象中的特定字段(例如first_name),则可以尝试

qs = (UserNotify.objects
    .filter(target=desired_target, notification_level__gte=2)
    .values_list('user_id', 'user__first_name')
    .order_by('user_id')
    .distinct('user_id')
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将一个对象的两个字段收集到同一列表中?

MySQL的两个外键来自同一个表

如何将两个字段归为一个键?

在一个聚合中从两个字段进行查找和分组

Laravel在同一个表中有两个外键

我正在做透视,我想为2个不同的字段做两个合计,但是对同一个字段进行透视

Django-对两个字段进行OR过滤,其中一个在相关表中

在ModelAdmin中显示一个相关对象的两个字段的最佳方法

在两个字段上进行全文搜索比在一个字段上搜索更快

MySQL的:使用两个外键到同一个表

django:不同类的两个字段一个循环?

django模型具有另一个模型的两个字段

JPA休眠两个指向同一个表的外键

Elasticsearch-配置,过滤器插件,将一个字段分成两个字段

当有时仅出现其中一个字段时,对ElasticSearch中的两个字段进行过滤

如何制作由两个外键组成的主键,“是同一个键”,无论值的顺序如何?

从同一个文件中读入两个字典(python)

mysql 查询引用同一个表的两个外键

如何使用不同的条件(SQL)更新同一个表中的两个字段?

如何添加两个字典列表值并保存在同一个字典中?

加入同一个表中的两个外键引用同一个主键

带有两个外键字段指向同一个外模型的模型的 Django 聚合?

从同一个类中获取两个移动的对象进行交互(pygame)

选择引用同一个主键表的两个外键的名称

两个关系表,同一个引用的两个外键。我如何加入数据?

如何比较同一个表中的两个字段以查看它们是否匹配、不匹配或在 SQL 中都为 NULL 和 Group By?

django 高效更新同一个字段多个对象

两个字典变量指向同一个对象,但它们相互影响

当两个外键列对应同一个键时,如何获取它们的值?