Tayffun Uzzun
Tayffun Uzzun

Reputation: 21

DRF nested serializer - object has no attribute

I am a newbie with django rest framework and python. and it is first time I asking a question here. thanks for helps from now..

--------------my models


class defined_views(models.Model):
    name = models.CharField(max_length=150)

class defined_permissions(models.Model):
    name = models.CharField(max_length=150)

class menuler(models.Model):
    adi= models.CharField(max_length=150, null=True)
    sira= models.PositiveIntegerField(null=True, blank=True)
    parentId= models.ForeignKey('self', null=True, on_delete=models.CASCADE)
    viewId= models.ForeignKey(defined_views, null=True, on_delete=models.CASCADE)
    menu_type= models.CharField(max_length=150, null=True)

class user_menu_permission(models.Model):
    userId = models.ForeignKey(User, null=False, on_delete=models.CASCADE)
    menuID = models.ForeignKey(menuler, null=False, on_delete=models.CASCADE)
    permissionID = models.ForeignKey(defined_permissions, null=True, on_delete=models.CASCADE)

-------------------serializer

class menulerSerializer(serializers.ModelSerializer):
    class Meta:
        model = menuler
        fields = ['id',  'adi', 'sira', 'parentId', 'viewId', 'menu_type'] 

class user_menu_permissionSerializer(serializers.ModelSerializer):
    menu = menulerSerializer()
    class Meta:
        model = user_menu_permission
        fields = ['menuID', 'permissionID', 'menu'] 

class UserSerializer(serializers.ModelSerializer):
    menuler = user_menu_permissionSerializer(
        source='user_menu_permission_set', many=True)
    class Meta:
        model = User
        fields = ['id', 'username', 'menuler']


------------------and view

class userView(APIView):

    def get(self, request):
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

I get this errror

"Got AttributeError when attempting to get a value for field menu on serializer user_menu_permissionSerializer. The serializer field might be named incorrectly and not match any attribute or key on the user_menu_permission instance. Original exception text was: 'user_menu_permission' object has no attribute 'menu'."


if I change user_menu_permissionSerializer like that

class user_menu_permissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = user_menu_permission
        fields = ['menuID', 'permissionID'] 

I get result like that bu I want get menu as tree also.. but unfortunetly...

[
    {
        "id": 1,
        "username": "admin",
        "menuler": []
    },
    {
        "id": 2,
        "username": "taner.kader",
        "menuler": [
            {
                "menuID": 2,
                "permissionID": 1
            },
            {
                "menuID": 3,
                "permissionID": 1
            },
            {
                "menuID": 5,
                "permissionID": 1
            }
        ]
    }
]

Upvotes: 1

Views: 3124

Answers (2)

Tayffun Uzzun
Tayffun Uzzun

Reputation: 21

I have solved like below

models

class defined_views(models.Model):
    name = models.CharField(max_length=150)

class defined_permissions(models.Model):
    name = models.CharField(max_length=150)

class menuler(models.Model):
    adi= models.CharField(max_length=150, null=True)
    sira= models.PositiveIntegerField(null=True, blank=True)
    parentId= models.ForeignKey('self', null=True, on_delete=models.CASCADE)
    viewId= models.ForeignKey(defined_views, null=True, on_delete=models.CASCADE)
    menu_type= models.CharField(max_length=150, null=True)
    permissionID = models.ManyToManyField(defined_permissions, through='user_menu_permission')
    userId = models.ManyToManyField(User, through='user_menu_permission')

class user_menu_permission(models.Model):
    # userId = models.ForeignKey(User, related_name='kullanici_menuler', null=False, on_delete=models.CASCADE)
    userId = models.ForeignKey(User, null=False, on_delete=models.CASCADE)
    menuID = models.ForeignKey(menuler,null=False, on_delete=models.CASCADE)
    permissionID = models.ForeignKey(defined_permissions, null=True, on_delete=models.CASCADE)

serializers

class defined_permissionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = defined_permissions
        fields = ['id', 'name'] 

class defined_viewsSerializer(serializers.ModelSerializer):
    class Meta:
        model = defined_views
        fields = ['id', 'name'] 

class menulerSerializer(serializers.ModelSerializer):
    class Meta:
        model = menuler
        fields = ['id',  'adi', 'sira', 'parentId', 'viewId', 'menu_type'] 
        # fields = ['adi'] 

class user_menu_permissionSerializer(serializers.ModelSerializer):
    # menu = menulerSerializer(many=True)

    class Meta:
        model = user_menu_permission
        fields = ['menuID', 'permissionID'] 


class UserSerializer(serializers.ModelSerializer):
    # menuler = user_menu_permissionSerializer(
    #     source='user_menu_permission_set', many=True)
    # kullanici_menuler = user_menu_permissionSerializer(many=True)
    kullanici_menuler= menulerSerializer(source='menuler_set', many=True)
    class Meta:
        model = User
        fields = ['id', 'username', 'kullanici_menuler']

and result

[
    {
        "id": 1,
        "username": "admin",
        "kullanici_menuler": []
    },
    {
        "id": 2,
        "username": "tayfun.uzun",
        "kullanici_menuler": [
            {
                "id": 2,
                "adi": "Yapılacaklar Listesi",
                "sira": 1,
                "parentId": 1,
                "viewId": 1,
                "menu_type": "view"
            },
            {
                "id": 3,
                "adi": "Raporlamalar",
                "sira": 2,
                "parentId": 1,
                "viewId": 2,
                "menu_type": "view"
            },
            {
                "id": 5,
                "adi": "Süreç İşleyişleri",
                "sira": 1,
                "parentId": 4,
                "viewId": 3,
                "menu_type": "view"
            }
        ]
    }
]

Upvotes: 1

satyajit
satyajit

Reputation: 694

Try below something like this:

serializer.py :

class user_menu_permissionSerializer(serializers.ModelSerializer):
    menu = menulerSerializer(many=True)
    class Meta:
        model = user_menu_permission
        fields = ['menuID', 'permissionID', 'menu'] 

views.py :

class userView(APIView):

    def get(self, request):
        data = User.objects.all()
        serializer = UserSerializer(data, many=True)
        return Response(serializer.data)

Upvotes: 0

Related Questions