Django 'dict' объект не имеет атрибута - PullRequest
0 голосов
/ 24 декабря 2018

Я делаю запросы, чтобы узнать общее количество яблок по месяцам.Теперь я хочу получить и напечатать данные total_apple.

fruits= Fruits.objects\
        .annotate(month = TruncMonth('sold_date'))\
        .values('month')\
        .annotate(total_apple=Sum('apple'))\
        .order_by('-month')

Я пробовал много способов распечатать его, но вернул ошибку.

Я пробовал:

1)

total_apple= fruits['total_apple']
print(total_apple)

2)

context['total_apple'] = total_apple
print(context)

Возвращена ошибка: No exception message supplied

3)

print(fruits.total_apple)

Ошибкавернул: 'QuerySet' object has no attribute 'total_apple'

Но когда я попытался print(fruits), он возвратил набор запросов, содержащий атрибуты, которые я хочу.

<QuerySet [{'month': datetime.date(2018, 10, 1), 'total_apple': 1636}, {'month': datetime.date(2018, 9, 1), 'total_apple': 1658},.....>

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018
fruits= Fruits.objects\
        .annotate(month = TruncMonth('sold_date'))\
        .values('month')\
        .annotate(total_apple=Sum('apple'))\
        .order_by('-month')

Этот запрос возвращает список объектов.Таким образом, вы можете перебрать fruits и напечатать fruit.total_apple

for fruit in fruits:
    print(fruit['total_apple'])

fruits, вернуть QueryDict, поэтому вам нужно получить доступ к его значению по ключу, например total_apple

под запросом..

Также отметьте, что если вы хотите получить один результат, вы можете запросить его следующим образом:

fruits= Fruits.objects\
            .annotate(month = TruncMonth('sold_date'))\
            .values('month')\
            .annotate(total_apple=Sum('apple'))\
            .order_by('-month').first()

Затем print(fruits.total_apple)

0 голосов
/ 24 декабря 2018

Вы всегда можете использовать оболочку python для проверки идей.Этот пример ясно показывает способ получения желаемого результата:

>>> from django.contrib.auth.models import User
>>> user = User.objects.all()
>>> user
<QuerySet [<User: bg>, <User: test>]>
>>> user.all()
<QuerySet [<User: bg>, <User: test>]>
>>> user[0]
<User: bg>
>>> user[1].username #this is the way to get theyou need to do
'test'
>>> user[1].password
'pbkdf2_sha256$100000$nJzzPRnFyNvq$MUmPTnzCKJRqxHskU5OpUtFIgMwY5Ap8fPMQMm4fUFQ

В вашем случае вы можете сделать цикл для печати всех объектов total_apple

for fruit in fruits:
    print(fruit.total_apple)

Пример:

>>> users = User.objects.all()
>>> for user in users:
...    print(user.username)
...    
bg
test
0 голосов
/ 24 декабря 2018

fruits - это набор запросов, а не экземпляр модели django.Попробуйте проиндексировать набор запросов fruits следующим образом:

fruits[0].total_apple

ОБНОВЛЕНИЕ

Поскольку в принятом ответе содержится .values, fruits[0]['total_apple'] будет работать нормально.fruits[0].total_apple.values() преобразует каждый объект в вашем наборе запросов в dict.

...