使用Django中的值从包含许多字段的queryset中提取智能列表

使用Django中的值从包含许多字段的queryset中提取智能列表,django,orm,many-to-many,Django,Orm,Many To Many,我基本上有这个模型: class MyModel(models.Model): uid = models.CharField() m2m = models.ManyToManyField(AnotherModel) class AnotherModel(models.Model): name = models.CharField() lang = models.CharField() 我想得到一个这样的口述列表(当然可能是过滤,但效果很好): 如果我这样做:

我基本上有这个模型:

class MyModel(models.Model):
    uid = models.CharField()
    m2m = models.ManyToManyField(AnotherModel)

class AnotherModel(models.Model):
    name = models.CharField()
    lang = models.CharField()
我想得到一个这样的口述列表(当然可能是过滤,但效果很好):

如果我这样做:

MyModel.objects.select_related('m2m').filter().values('uid', 'm2m__name')
我得到以下信息:

[{
    'uid': name_1,
    'm2m__name': m2m_1.name
},{
    'uid': name_1,
    'm2m__name': m2m_2.name
}]
MyModel.objects.filter( ... ).values('uid', names=ArrayAgg('m2m__name'))
<MyModelQuerySet [{'uid': 'id_1', 'names': ['name_1', 'name_2', ...]}]>
我有两个问题:

  • 我每个m2m都有一个单独的列表项!我只希望每个UID有一个,列表中有m2m名称
  • 我得到了“m2m_____________________________________
  • (如果我没有明确询问
    m2m\uu name
    并且只使用
    m2m
    我不会得到unicode而是ID)

    有没有一种方法可以直接在queryset中解决这些问题,而不必经过python循环?最有效的方法是什么

    编辑

    …也许使用.raw()或.extra()和一些自烘焙SQL至少可以解决问题2


    我觉得很奇怪,没有人对这个问题感兴趣,但我最终循环了结果,建立了自己想要的列表:

    my_list = {}
    for item in items:
        _uid = item['uid']
        _name = item['m2m__name']
        list_item = my_list.get(, {'uid': _uid, 'name': set([_name])})
        list_item['name'].add(_name)
    
    这将导致如下结果:

    my_list = { 'uid': {
        'uid': uid,
        'm2m': [m2m.name, m2m.name, ...]
    }}
    
    哪些项目正是问题中需要的


    我本来希望能够在QuerySet级别解决至少一个问题,但…

    我自己也有这个问题,必须将多个信息拼凑在一起才能得到答案。对其他人来说,这就是我的发现。这仅在使用Postgres>=9.4Django>=9.0时有效

    您可以执行以下操作:

    [{
        'uid': name_1,
        'm2m__name': m2m_1.name
    },{
        'uid': name_1,
        'm2m__name': m2m_2.name
    }]
    
    MyModel.objects.filter( ... ).values('uid', names=ArrayAgg('m2m__name'))
    
    <MyModelQuerySet [{'uid': 'id_1', 'names': ['name_1', 'name_2', ...]}]>
    
    将产生以下结果:

    [{
        'uid': name_1,
        'm2m__name': m2m_1.name
    },{
        'uid': name_1,
        'm2m__name': m2m_2.name
    }]
    
    MyModel.objects.filter( ... ).values('uid', names=ArrayAgg('m2m__name'))
    
    <MyModelQuerySet [{'uid': 'id_1', 'names': ['name_1', 'name_2', ...]}]>
    

    快点!我不想接受我自己的答案!!!:)一定有更好的解决办法。。。