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")
)