如何根据 DRF 中的模型对所有数据进行分组?

How can i group by all data according to model in DRF?

目前,我正在开发一个 DFR 项目,可以成功获取所有数据,但我需要对 json 数据进行一些修改。

这是代码

class PermissionSerializers(serializers.ModelSerializer):

class Meta:
    model = Permission
    fields = ['id', 'name', 'codename']

def to_representation(self, instance):
    return {
        'model': instance.content_type.name,
        'data' :{
            'id': instance.id,
            'name': instance.name,
            'codename': instance.codename,
        }
    }

我得到了这种 JSON 格式,

{
"next": "http://127.0.0.1:8000/en/ga/api-version/common/admin/permissions/?page=4",
"previous": "http://127.0.0.1:8000/en/ga/api-version/common/admin/permissions/?page=2",
"total": 33,
"page": 3,
"page_size": 10,
"results": [
    {
        "model": "user",
        "data": {
            "id": 25,
            "name": "Can add user",
            "codename": "add_user"
        }
    },
    {
        "model": "user",
        "data": {
            "id": 29,
            "name": "Admistrative Access",
            "codename": "admin_access"
        }
    },

但我想用这样的东西进行修改,它在顶部有模型名称,然后是字典中的所有可用数据:

{
        "model": "user",
        "data": {
            "id": 26,
            "name": "Can change user",
            "codename": "change_user"
        },
        {
            "id": 25,
            "name": "Can add user",
            "codename": "add_user"
        },
    },






   

你得到这样的东西是因为你的 API 中有分页,如果你不想要它,只需禁用分页即可。

我想到了这个解决方案:

def list(self, request):
    _models_list = [
        'organization','user','group', 'logentry', 'organizationtype',
        'keyword', 'productsupport','feedbacksupport','twittercredential']
    models = ContentType.objects.filter(model__in = _models_list)
    model_dict = {
        'model': '',
        'data':''
    }
    results = []

    for model in models:
        _permissions = []
        access = ' Access'
        if model.model == 'group':
            model_dict['model'] = 'Role'+ access
        elif model.model == 'organizationtype':
            model_dict['model'] = 'Organization Type'+ access
        elif model.model == 'productsupport':
            model_dict['model'] = 'Product'+ access
        elif model.model == 'feedbacksupport':
            model_dict['model'] = 'Feedback'+ access
        else:
            model_dict['model'] = model.model.capitalize()+ access
        permissions = Permission.objects.filter(content_type = model)
        for premission in permissions:
            _permissions.append(premission)
        
        serializer = PermissionSerializers(_permissions, many=True)
        data = serializer.data
        model_dict['data'] = data
        results.append(model_dict.copy())
        
    return Response(results)