python – 复杂的django查询,包括一对一模型

python – 复杂的django查询,包括一对一模型,第1张

概述我有一个用户对象,它与一个配置文件对象有一对一的关系. class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True, max_length=255) mobile = PhoneNumberField(null=True) username = models.Ch 我有一个用户对象,它与一个配置文件对象有一对一的关系.

class User(AbstractBaseUser,PermissionsMixin):    email = models.EmailFIEld(unique=True,max_length=255)    mobile = PhoneNumberFIEld(null=True)    username = models.CharFIEld(null=False,unique=True,max_length=255)    is_online = models.BooleanFIEld(default=False)class UserProfile(models.Model):    user = models.OnetoOneFIEld(User,related_name='profile',on_delete=models.CASCADE,)    badge = models.ImageFIEld(upload_to='media/badges/',null=True)    reputation = models.IntegerFIEld(default=0)    status = models.CharFIEld(max_length=255,null=True,blank=True)@H_403_12@  

现在,我正在尝试获取所有在线用户并通过信誉(在配置文件对象中)对其进行排序,并排除名誉小于200的用户.

这是我的查询不起作用,

User.objects.filter(is_online=True).order_by('reputation').exclude('reputation' < 200)@H_403_12@  

有人可以帮助这个查询的正确格式吗?

解决方法 好吧,如果你写.exclude(‘reputation’< 200),那么Python将首先评估'声誉'< 200 - 将在Python 3.x中 - 无法比较,并且在Python-2.x中返回False,然后将该布尔值传递给排除. 但请注意,您根本不会过滤声誉.它只是一个布尔值(在最好的情况下),你传递给过滤器. 您可以使用参数名称在Django中执行比较:使用__lt后缀表示“小于”. 另一件事是您在用户上查询,但信誉存储在UserProfile中,因此您需要遵循反向外键(这种反向关系用于过滤器配置文件,您可以通过使用两个连续的下划线再次访问它). 所以我们可以用以下方法解决排除部分:

(User.objects.filter(is_online=True)                        .order_by('profile__reputation')                        .exclude(profile__reputation__lt=200))@H_403_12@  

请注意,如果排除低于200的值,这与过滤等于和大于200的值基本相同,因此我们可以将其移至过滤器部分:

(User.objects.filter(is_online=True,profile__reputation__gte=200)                        .order_by('profile__reputation'))@H_403_12@                            	          总结       

以上是内存溢出为你收集整理的python – 复杂的django查询,包括一对一模型全部内容,希望文章能够帮你解决python – 复杂的django查询,包括一对一模型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1194365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存