【问题标题】:Django Annotate - Concat from last created ManyToMany Object FieldsDjango Annotate - 来自上次创建的 ManyToMany 对象字段的 Concat
【发布时间】:2021-07-12 15:26:32
【问题描述】:
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], output_field=CharField()),
    buildingname_str=Subquery(address_subquery.values('buildingname')[:1], output_field=CharField()),
    buildingnnumber_str=Subquery(address_subquery.values('buildingnnumber')[:1], output_field=CharField()),
).annotate(
    address_text_str=Concat(
        'subbuildingname_str', Value(' '),
        'buildingname', Value(' '),
        'buildingnumber', Value(' '),
        'street_str',
        output_field=CharField(),
        default=""
    )
).values_list('name', 'address_text_str')

【问题讨论】:

    标签: mysql django orm prefetch annotate


    【解决方案1】:

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

    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

    【讨论】:

    • Address.objects.filter(user__id=F('pk')).order_by('created') 和 Address.objects.filter(user=F('pk') 没有区别).order_by('created')
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2011-06-21
    • 2022-11-04
    • 2013-05-19
    • 2012-06-22
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多