Почему у этих двух способов разные результаты? (Django Rest Framework 3.9) - PullRequest
0 голосов
/ 12 апреля 2019

Один и тот же код отличается результатами.Итак, почему?

# 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. user:
SELECT DISTINCT `myuser_myuser`.`area` FROM `myuser_myuser`

сначала:
# 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

second:
SELECT DISTINCT `prj001_generalinfo`.`hospital` FROM `prj001_generalinfo` ORDER BY `prj001_generalinfo`.`hospital` ASC

user и first: Очевидно, они одинаковы.Но соответствующий запрос отличается.

Я хочу, чтобы результат для пользователя был таким же, как и для первого.И, третья форма отвечает моим требованиям.

1 Ответ

0 голосов
/ 12 апреля 2019

Если первый запрос distinct() не дает вам определенных значений, а второй (с определенным предложением order_by) дает, то в вашей модели Info определено значение по умолчанию ordering.

Вы можете использовать пустой order_by() (или другой order_by, как в вашем примере), чтобы отключить порядок по умолчанию.

Причина в том, что столбцы, используемые для упорядочения, включены в запрос SQL и, следовательно, в отдельное сравнение, даже если они не возвращаются пользователю (что приводит к дублированию строк). Django docs объясняет это подробно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...