Python django多对多,同时具有三个表关系
我想创建一个具有3个模型和多对多关系的seralizer:Python django多对多,同时具有三个表关系,python,django,django-rest-framework,many-to-many,serialization,Python,Django,Django Rest Framework,Many To Many,Serialization,我想创建一个具有3个模型和多对多关系的seralizer: # models.py class Permission(models.Model): permission_name = models.CharField(max_length=20) class Feature(models.Model): feature_name = models.CharField(max_length=40) class Role(models.Model): name = mo
# models.py
class Permission(models.Model):
permission_name = models.CharField(max_length=20)
class Feature(models.Model):
feature_name = models.CharField(max_length=40)
class Role(models.Model):
name = models.CharField(max_length=40)
permissions = models.ManyToManyField(Permission, through='RolePermission')
features = models.ManyToManyField(Feature, through='RolePermission')
class RolePermission(models.Model):
role = models.ForeignKey(Role, on_delete=models.CASCADE)
permission = models.ForeignKey(Permission, on_delete=models.CASCADE)
feature = models.ForeignKey(Feature, on_delete=models.CASCADE)
样本数据:
PERMISSION:
1 - add
2 - edit
3 - remove
4 - view
FEATURE:
1 - user
2 - device
ROLE:
1 - ROLE1
2 - ROLE2
[
{
"id": 1,
"name": "ROLE1",
"features": [
{
"id": 1,
"name": "user",
"permissions": [
{
"id": 1,
"name": "add"
},
{
"id": 2,
"name": "edit"
},
{
"id": 3,
"name": "remove"
},
{
"id": 4,
"name": "view"
}
]
},
{
"id": 2,
"name": "device",
"permissions": [
{
"id": 4,
"name": "view"
}
]
}
]
},
{
"id": 2,
"name": "ROLE2",
"features": [
{
"id": 1,
"name": "user",
"permissions": [
{
"id": 4,
"name": "view"
}
]
},
{
"id": 2,
"name": "device",
"permissions": [
{
"id": 4,
"name": "view"
}
]
}
]
}
]
我想从视图中响应的数据:
PERMISSION:
1 - add
2 - edit
3 - remove
4 - view
FEATURE:
1 - user
2 - device
ROLE:
1 - ROLE1
2 - ROLE2
[
{
"id": 1,
"name": "ROLE1",
"features": [
{
"id": 1,
"name": "user",
"permissions": [
{
"id": 1,
"name": "add"
},
{
"id": 2,
"name": "edit"
},
{
"id": 3,
"name": "remove"
},
{
"id": 4,
"name": "view"
}
]
},
{
"id": 2,
"name": "device",
"permissions": [
{
"id": 4,
"name": "view"
}
]
}
]
},
{
"id": 2,
"name": "ROLE2",
"features": [
{
"id": 1,
"name": "user",
"permissions": [
{
"id": 4,
"name": "view"
}
]
},
{
"id": 2,
"name": "device",
"permissions": [
{
"id": 4,
"name": "view"
}
]
}
]
}
]
但是我不能正确地编写序列化程序
非常感谢您的帮助。我想您应该使用此代码,可能有不同的字段名
class PermisionSerializer(serializers.ModelSerializer):
class Meta:
model = Permission
fields = ('name', )
class FeatureSerializer(serializers.ModelSerializer):
permissions = PermisionSerializer(many=True)
class Meta:
model = Feature
fields = ('name', 'permissions', )
class RoleSerializer(serializers.ModelSerializer):
features = FeatureSerializer(many=True)
class Meta:
model = Role
fields = ('name', 'features', )
我想你应该使用这个代码,也许有不同的字段名
class PermisionSerializer(serializers.ModelSerializer):
class Meta:
model = Permission
fields = ('name', )
class FeatureSerializer(serializers.ModelSerializer):
permissions = PermisionSerializer(many=True)
class Meta:
model = Feature
fields = ('name', 'permissions', )
class RoleSerializer(serializers.ModelSerializer):
features = FeatureSerializer(many=True)
class Meta:
model = Role
fields = ('name', 'features', )
我在使用此序列化程序时遇到了一些问题:AttributeError:get AttributeError在尝试获取序列化程序
功能序列化程序上的字段权限的值时遇到了问题。序列化程序字段的名称可能不正确,并且与功能
实例上的任何属性或键都不匹配。原始异常文本是:“功能”对象没有“权限”属性。我想您需要将“权限”字段从角色模型移动到功能模型。另外,对于模型来说,它的结构会更好。)我在使用这个序列化程序时遇到一些问题:AttributeError:get AttributeError试图获取序列化程序功能序列化程序上的字段权限的值。序列化程序字段的名称可能不正确,并且与功能
实例上的任何属性或键都不匹配。原始异常文本是:“功能”对象没有“权限”属性。我想您需要将“权限”字段从角色模型移动到功能模型。而且,对于模型来说,它的结构会更好)