【问题标题】:DRF nested serializer - object has no attributeDRF 嵌套序列化程序 - 对象没有属性
【发布时间】:2020-12-20 13:03:13
【问题描述】:

我是 django rest 框架和 python 的新手。这是我第一次在这里提问。从现在开始感谢您的帮助..

-------------我的模型


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)

-------序列化程序

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)

我得到了这个错误

“在序列化程序 user_menu_permissionSerializer 上尝试获取字段 menu 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 user_menu_permission 实例上的任何属性或键都不匹配。 原始异常文本为:“user_menu_permission”对象没有属性“menu”。”


如果我像那样更改 user_menu_permissionSerializer

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

我得到这样的结果,但我也想将菜单作为树..但不幸的是......

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

【问题讨论】:

  • 你在哪里调用data
  • 另外一件事是,你是不是忘了在menu = menulerSerializer() 中将参数作为many=True 传递?
  • 我也试过 many=true 但是错误是一样的..class userView(APIView): def get(self, request): queryset = User.objects.all() serializer = UserSerializer(queryset, many=True) return Response(serializer.data)我用这个视图来获取数据
  • 在这里分享你的 github 存储库...这样我们就可以看到你在哪里卡住了。

标签: django-rest-framework nested serialization


【解决方案1】:

试试下面这样的:

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)

【讨论】:

    【解决方案2】:

    我已经解决了如下

    型号

    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)
    

    序列化器

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

    结果

    [
        {
            "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"
                }
            ]
        }
    ]
    

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 2022-12-01
      • 2020-01-12
      • 2020-05-04
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多