Django Подзапрос на множество значений

class Category(models.Model):
    name = models.CharField(max_length=100)
    date = models.DateTimeField(auto_now=True)


class Hero(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

Мне нужно имя модели категории, данные, id

В cookbook, я написал код, как указано выше.

hero_qs = Hero.objects.filter(
    category=OuterRef("pk")
).order_by("-benevolence_factor")

Category.objects.all().annotate(
    most_benevolent_hero=Subquery(
    hero_qs.values('name')[:1]
    )
)

Кажется, что в hero_qs.values('name')

можно ввести только одно значение.

Можно ли получить имя, данные, id с помощью одного аннотата?

Вы можете попробовать объединить поля, если вы действительно хотите использовать одну аннотацию

from django.db.models import Subquery, OuterRef, CharField, Value as V
from django.db.models.functions import Concat

hero_qs = Hero.objects.filter(
    category=OuterRef("pk")
).order_by("-benevolence_factor").annotate(
    details=Concat('name', V(','), 'id', output_field=CharField())
)

Category.objects.all().annotate(
    most_benevolent_hero=Subquery(
    hero_qs.values('details')[:1]
    )
)

Тогда вы можете использовать интерполяцию строк для разделения этих данных, что является относительно недорогой операцией

name, id = category.most_benevolent_hero.split(',')

Вернуться на верх