1

我有以下的情况
Django的REST框架 “的GroupBy” ModelSerializer

class MyModel(models.Model): 
    key = models.CharField(max_length=255) 
    value = models.TextField(max_length=255) 
    category = models.CharField(max_length=4) 
    mode = models.CharField(max_length=4) 

领域keycategorymode独特在一起。我有以下对象:

m1 = MyModel(key='MODEL_KEY', value='1', category='CAT_1' mode='MODE_1') 
    m2 = MyModel(key='MODEL_KEY', value='2', category='CAT_1' mode='MODE_2') 
    m3 = MyModel(key='MODEL_KEY', value='1', category='CAT_2' mode='MODE_1') 
    m4 = MyModel(key='MODEL_KEY', value='2', category='CAT_2' mode='MODE_2') 

我想keycategory暴露了一个API,将组这样的序列化的数据将会是这个样子:

{ 
    "key": "MODEL_KEY", 
    "category": "CAT_1" 
    "MODE_1": { "id": 1, "value": "1" } 
    "MODE_2": { "id": 2, "value": "2" } 
}, 
{ 
    "key": "MODEL_KEY", 
    "category": "CAT_2" 
    "MODE_1": { "id": 3, "value": "1" } 
    "MODE_2": { "id": 4, "value": "2" } 
} 

是否有这样做的任何方式在django rest框架中使用ModelSerializer

回答

1

有模块,允许您将Django模型,仍然有一个QuerySet结果中的工作:https://github.com/kako-nawao/django-group-by

使用上面,形成你的查询集:

# Postgres specific! 
from django.contrib.postgres.aggregates.general import ArrayAgg 

qs = MyModel.objects.group_by('key', 'category').annotate(
     mode_list=ArrayAgg('mode')).order_by(
     'key', 'category').distinct() 

然后,您可以访问属性key,categorymode_list作为像qs[0].mode_list这样的属性生成的QuerySet项目。因此,在你的序列化,你可以简单地命名他们为各个领域。

model_list场可能需要使用一些自定义代码SerializerMethodField改造名单。

请注意,如果您不想按mode进行分组,则需要聚合。