Django, подзапрос, более одной строки, возвращаемой подзапросом, используемым в качестве выражения

Вот структура моей модели

class ContentFlag(models.Model):
    user = models.ForeignKey(
        User,
        verbose_name="user",
        related_name="object_flags",
        on_delete=models.CASCADE,
    )
    flag = models.CharField(max_length=30, db_index=True)
    content_type = models.ForeignKey(
        ContentType, on_delete=models.CASCADE
    )
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey("content_type", "object_id")


class Article(models.Model):
    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        verbose_name=_("owner"),
        null=True,
        blank=True,
        editable=True,
        on_delete=models.SET_NULL,
        related_name="owned_pages",
    )
    flags = GenericRelation(ContentFlag, related_query_name="%(class)s_flags")
    title = models.CharField(max_length=255)


class User(index.Indexed, AbstractUser):    
    email = EmailField(verbose_name="email", unique=True, null=True, blank=True)
    name = models.CharField(
        blank=True,
        max_length=100,
    )
    flags = GenericRelation(to="core.ContentFlag")

Мне нужно рассчитать рейтинг пользователя на основе количества флагов. Вот что я делаю для этого

    subquery_plus = ContentFlag.objects.filter(
        Q(article_flags__owner_id=OuterRef("id")),
        flag=LIKEDIT_FLAG,
    ).values("id")
    top_users = (
        User.objects.annotate(
            rating_plus=Count(Subquery(subquery_plus)),
        ).order_by("-rating_plus")
    )

Но я получил ошибку

django.db.utils.ProgrammingError: more than one row returned by a subquery used as an expression

Как я могу это исправить?

Вам нужно ограничить результаты подзапроса до 1. Вы можете достичь этого с помощью нарезки - [:1]

top_users = (
    User.objects.annotate(
        rating_plus=Count(Subquery(subquery_plus[:1])),
    ).order_by("-rating_plus")
)
Вернуться на верх