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')) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |