Search code examples
djangodjango-modelsserializationdjango-rest-frameworkdjango-serializer

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


Currently, I am working on a DFR project where can successfully get all data but i need some modify with the json data.

Here Is the code

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,
        }
    }

And i get this JSON format,

{
"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"
        }
    },

But I want to modify with something like this which has model name on top and then all available data inside a dictionary:

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






   

Solution

  • I came up with this solution:

    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)