Задать вопрос
timofeydeys
@timofeydeys
Свобода творцов

Как правильно прикрепить аннотацию в queryset?

Есть модели:
class answer(models.Model):
    name = models.CharFIeld("Name", max_length=10)

class message(models.Model):
    message = models.CharField("Message", max_length=50)
    look = models.BooleanField(default=False)
    answer = models.ForeignKey(answer)

А нужно мне получить набор queryset 'answer' и прикрепить к каждому объекту два атрибута типа Boolean содержания: Если есть
message(look=False, answer=(к текущему объекту итерции answer)) то True  Иначе False


И кол-во связанных messages к каждому answer

Костылями так делается( допустим будущее поле называется look_bool, new_bool):
for item in answer.objects.all():  # filter(...)
    messages_ = message.objects.filter(answer=item)
    if messages_ .count():
        item.look_bool= True 
    else:
        item.look_bool= False
    if messages_ .filter(view=False).count():
        item.new_bool= True 
    else:
        item.new_bool= False

А как сделать правильно без кучи запросов? Может есть какое элегантрое решение, или скажите куда курить. Про кучу запросов, я имею ввиду(потому что для каждого объекта answer делает полноценный запрос) messages_ = message.objects.filter(answer=item)

P.S. Может я не так смотрю на задачу. Требуется для дальнейшей передачи в шаблон набора(
django.views.generic.ListView
), и там при True отображать доп поле у answer.

Нашел доку, но не разобрался до конца. https://docs.djangoproject.com/en/dev/topics/db/ag...

ВОт пример моего кода: который работает не так как я хочу:
answ = answer.objects.all()  # filter(...)
answ.annotate(
            count_message=Count('message')
        ).annotate(
        new_message=Count('message')
        ).filter(
        message__look=False
    )
  • Вопрос задан
  • 206 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы