TypeError: QuerySet.annotate() получил невыражение(я): <django.db.models.fields.IntegerField>.

Я пытаюсь создать пользовательский метод менеджера, который аннотирует QuerySet модели Tag. Цель этого - подсчитать, сколько раз тег встречается во всех вопросах, заданных пользователем.

Однако при этом возникает следующая ошибка: TypeError: QuerySet.annotate() received non-expression(s): <django.db.models.fields.IntegerField>. Это происходит после получения другой ошибки: django.core.exceptions.FieldError: Cannot resolve expression type, unknown output_field.

По следующей ссылке рассматривается ошибка FieldError, которая была у меня первоначально; предоставленный ответ не устранил ошибку, поскольку теперь она вызывает ошибку TypeError.

Как это можно исправить, чтобы ни одна из ошибок не возникала?


class TagManager(Manager):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def count(self, profile):
        user_questions = Question.objects.filter(profile=profile)
        return self.model.objects.filter(
            name__in=set(user_questions.values_list("tags", flat=True))
        ).annotate(posts=Subquery(user_questions.filter(
            tags__name=OuterRef("name")
        ).count()), output_field=IntegerField()).order_by("-posts")


class Tag(Model):

    name = CharField(unique=True, max_length=25)

    objects = Manager()
    postings = TagManager()

    class Meta:
        default_manager_name = "objects"


class Post(Model):

    body = TextField()
    date = DateField(default=date.today)
    comment = ForeignKey('Comment', on_delete=CASCADE, null=True)
    profile = ForeignKey(
        'authors.Profile', on_delete=SET_NULL, null=True,
        related_name='%(class)ss',
        related_query_name="%(class)s"
    )
    score = GenericRelation(
        'Vote', related_query_name="%(class)s"
    )


    class Meta:
        abstract = True


class Question(Post):

    title = CharField(max_length=75)
    tags = ManyToManyField(
        'Tag', related_name="questions", related_query_name="question"
    )
Вернуться на верх