Django Annotate - 从上次创建的多对多对象字段连接

问题描述

class User(models.Model):
    name=CharField()


class Address(models.Model):
    user= Foreignkey(user,related_name="Addresses")
    buildingname=CharField()
    subbuildingname=CharField()
    town=CharField()
    ...

我有一个像 top 这样的模型,想提取如下列表中的数据。

{
    [
        ['USERNAME1','A XYZBUILDING 14 Drain St. '],['USERNAME2','C XXXBUILDING 13 Drain St. '],['USERNAME3','B ZZZBUILDING 12 Drain St. '],...
    ]
    
}

也作为一种解决方法,这是最接近答案的事情,但我无法完成

无需循环每个用户

无需在额外方法的选择字段中执行原始 sql

我想用 Django ORM 来实现这一点。

address_subquery = Address.objects.filter(user__id=F('pk')).order_by('created')
User.objects.filter(**my_custom_filters).annotate(
    subbuildingname_str=Subquery(address_subquery.values('subbuildingname')[:1],output_field=CharField()),street_str=Subquery(address_subquery.values('street')[:1],buildingname_str=Subquery(address_subquery.values('buildingname')[:1],buildingnnumber_str=Subquery(address_subquery.values('buildingnnumber')[:1],).annotate(
    address_text_str=Concat(
        'subbuildingname_str',Value(' '),'buildingname','buildingnumber','street_str',output_field=CharField(),default=""
    )
).values_list('name','address_text_str')

解决方法

实际上您在子查询中做错了,您必须像这样编写子查询:-

from django.db.models import OuterRef

address_subquery = Address.objects.filter(user=OuterRef('pk')).order_by('created')

您可以从这里参考https://docs.djangoproject.com/en/3.2/ref/models/expressions/#subquery-expressions

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...