1

У меня следующая ситуация
Django-REST-Framework "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) 

поля key, category и mode являются уникальный вместе. У меня есть следующие объекты:

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') 

я хочу разоблачить API, который будет группировать по key и category поэтому сериализованные данные будут выглядеть примерно так:

{ 
    "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 с ModelSerializer.

ответ

1

Существует модуль, который позволяет группировать модели Django и до сих пор работает с QuerySet в результате: https://github.com/kako-nawao/django-group-by

Используя выше, чтобы сформировать свое QuerySet:

# 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, category и mode_list на результирующих элементов QuerySet как атрибуты, как qs[0].mode_list. Поэтому в вашем сериализаторе вы можете просто назвать их как поля.

Поле model_list может потребовать SerializerMethodField с использованием специального кода для преобразования списка.

Обратите внимание, что вам нужно агрегировать, если вы не хотите, чтобы группы по mode, а также.

Смежные вопросы