加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:14:20 所属栏目:Python 来源:网络整理
导读:我有一个用户对象,它与一个配置文件对象有一对一的关系. class User(AbstractBaseUser,PermissionsMixin): email = models.EmailField(unique=True,max_length=255) mobile = PhoneNumberField(null=True) username = models.CharField(null=False,unique=Tr
我有一个用户对象,它与一个配置文件对象有一对一的关系.

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)

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

这是我的查询不起作用,

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

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

解决方法

好吧,如果你写.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))

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

(User.objects.filter(is_online=True,profile__reputation__gte=200)
                        .order_by('profile__reputation'))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读