Как получить все значения для определенного поля в django ORM?

#python #django

#python #django

Вопрос:

У меня есть таблица с именем user_info . Я хочу получить имена всех пользователей. Итак, в таблице есть поле с именем name . Итак, в sql я делаю что-то вроде

 SELECT distinct(name) from user_info
  

Но я не могу понять, как сделать то же самое в django. Обычно, если у меня уже есть определенное известное значение, я могу сделать что-то вроде приведенного ниже.

 user_info.objects.filter(name='Alex')
  

А затем получить информацию для этого конкретного пользователя.

Но в этом случае для данной таблицы я хочу получить все значения имен, используя django ORM точно так же, как я делаю в sql.

Вот моя модель django

 class user_info(models.Model):
    name = models.CharField(max_length=255)
    priority = models.CharField(max_length=1)
    org = models.CharField(max_length=20)
  

Как я могу это сделать в django?

Ответ №1:

Вы можете использовать values_list .

 user_info.objects.values_list('name', flat=True).distinct()
  

Обратите внимание, в Python классы обычно определяются в InitialCaps: ваша модель должна быть userInfo.

Комментарии:

1. Извините @daniel, я понимаю, что это надолго. Но, делая это для модели, в которой есть названия компаний, я получил только целые числа. Вроде: <QuerySet [11, 14, 11]> вместо Google, Apple, Tesla . Есть идеи по причине, почему?

Ответ №2:

Вы можете использовать values_list() то, что указано в ответе Даниэля, который предоставит вам ваши данные в виде списка, содержащего значения в поле. Или вы также можете использовать, values() вот так:

 user_info.object.values('name')
  

который вернет вам набор запросов, содержащий словарь. values_list() и values() используются для выбора столбцов в таблице.

Ответ №3:

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

     `Post.objects.values_list('author__username')` 
  

Post — это класс модели, имеющий author в качестве поля внешнего ключа, которое, в свою очередь, имеет свое поле username:
Здесь к полю «автор» было добавлено двойное значение undersocre, за которым следует поле «имя», в противном случае в наборе запросов будет возвращен первичный ключ модели. Я предполагаю, что это было сомнение @ Carlo в принятом ответе.

Ответ №4:

Вот мой быстрый способ получить это! 😉

 names_list = list(
    UserInfo.objects.distinct().order_by('name').values_list('name', flat=True)
)
  

Комментарии:

1. можете ли вы каким-либо образом обосновать утверждение «blazing speed»? И зачем это вообще нужно указывать?

2. Человек… Я полагаю, у вас сегодня был плохой день. Пожалуйста, посмотрите на это: youtube.com/watch?v=HjPgdhRsGIQamp;ab_channel=MasoodBoomgaard Скажите мне более быстрый и эффективный способ извлечь это из вашей базы данных, и я понизлю свой комментарий до «вот один из способов сделать это». 🙂