为什么两种方法的结果不同?(Django Rest Framework 3.9)

时间:2019-04-12 06:27:14

标签: python django

相同代码的结果不同。那为什么呢?

# prj001 is the app name

# MyUser 
class MyUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True,)
    phone = models.CharField(max_length=20, unique=True)
    area = models.CharField(max_length=100,
                            null=True)
    ...

users = MyUser.objects.values('area').distinct()  # user

# Generalinfo 
class GeneralInfo(models.Model):
    owner = models.ForeignKey('myuser.MyUser',
                              null=True,
                              related_name='mygi',
                              on_delete=models.CASCADE)
    hospital = models.CharField(max_length=100)
    ...

info_one = Info.objects.values('hospital').distinct()    # first

print(info_one.query)

info_two = Info.objects.order_by('hospital').values('hospital').distinct()  # second

print(info_two.query)
  1. 用户:
SELECT DISTINCT `myuser_myuser`.`area` FROM `myuser_myuser`

  1. 第一:
# recdate is a DateField
# recdate = models.DateField(default=date.today)
SELECT DISTINCT `prj001_generalinfo`.`hospital`, `prj001_generalinfo`.`recdate`, `prj001_generalinfo`.`id` FROM `prj001_generalinfo` ORDER BY `prj001_generalinfo`.`recdate` DESC, `prj001_generalinfo`.`id` DESC

  1. 秒:
SELECT DISTINCT `prj001_generalinfo`.`hospital` FROM `prj001_generalinfo` ORDER BY `prj001_generalinfo`.`hospital` ASC

user和first:显然,它们是相同的。但是相应的查询是不同的。

我希望用户结果与第一个相同。 而且,第三种形式符合我的要求。

1 个答案:

答案 0 :(得分:0)

如果第一个distinct()查询没有为您提供不同的值,但是第二个查询(具有特定的order_by子句)则为您提供了默认值,则您在{{ 1}}模型。

您可以使用空的ordering(或示例中的其他Info)来禁用默认排序。

原因是用于排序的列包含在SQL查询中,因此即使它们没有返回给用户(导致重复的行)也包含在不同的比较中。 Django docs对此进行了详细解释。