我有一个与此类似的数据库架构:
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()
但这对我来说似乎太过分了,我相信它会执行两个查询。
有没有一种方法可以通过单个查询解决我的问题?
我一直在寻找这种行为,但从未找到比您描述的更好的方法(创建一个查询用户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] 删除。
我来说两句