django Метод "only ()" не работает должным образом - PullRequest
1 голос
/ 24 января 2020

Models.py

class Post(models.Model):
    id = models.IntegerField(default=0)
    name = models.CharField(max_length=200, default='', blank=True)
    click = models.IntegerField(default=0)
    content = models.CharField(max_length=200, default='', blank=True)

Ниже, что я кодировал

post = Post.objects.filter(id=3).only('name')
print(post.values())

Результат, который я ожидал

<QuerySet [{'name': 'Micheal'}]>

Но фактический результат был

<QuerySet [{'id': 3, 'name': 'Micheal', 'click': 2, 'content': 'asdf'}]>

Как я могу решить проблему?

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Похоже, вы неправильно поняли использование only():

Метод only () более или менее противоположен defer (). Вы называете это с полями, которые не должны быть отложены при получении модели. Если у вас есть модель, в которой почти все поля необходимо отложить, использование только () для указания дополнительного набора полей может привести к упрощению кода.

Что вы ищете, так это values() и values_list():

Post.objects.filter(id=3).values('name')
1 голос
/ 24 января 2020
post = Post.objects.filter(id=3).only('name')
print(post.values())

Мы можем написать ваш запрос в одну строку, например:

post = Post.objects.filter(id=3).only('name').values()
print(post)

В values ​​() , если вы не указали поля каждый словарь будет содержать ключ и значение для every field in the database table.

Метод values ​​() принимает необязательные позиционные аргументы, * fields, которые определяют имена полей, которыми должен ограничиваться SELECT , Если вы укажете поля, каждый словарь будет содержать только ключи / значения полей для указанных вами полей. Если вы не укажете поля, каждый словарь будет содержать ключ и значение для каждого поля в таблице базы данных.


Итак, вот почему:

<QuerySet [{'id': 3, 'name': 'Micheal', 'click': 2, 'content': 'asdf'}]>

Является ли ожидаемый результат.


Как решить проблему?

  • Только пользователь значения () или values_list () .
  • Возможно, вас заинтересует аргумент flat=True, равный values_list(), так как вам нужно только одно поле (name).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...