Django 子查询多个值
Django Subquery many values
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')
好像只能输入一个值
是否可以通过一个annotate获取name、data、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(',')
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')
好像只能输入一个值是否可以通过一个annotate获取name、data、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(',')