更新:序列化程序上的initial_data和validated_data之间的区别。
“ vulnerabilites”消失
为什么会有这样的区别,因为漏洞字段是M2M字段
>>> from api.serializers import AssetSerializer
>>> serializer = AssetSerializer(data={"key": "A999","id": "A999","name": "Asset 999","weight": 10,"vulnerabilities": ["V001"]})
>>> serializer.is_valid()
True
>>> serializer.initial_data
{'key': 'A999', 'id': 'A999', 'name': 'Asset 999', 'weight': 10, 'vulnerabilities': ['V001']}
>>> serializer.validated_data
OrderedDict([('id', 'A999'), ('name', 'Asset 999'), ('weight', 10)])
我想使用DRF向模型添加M2M条目。 我发现这篇文章https://medium.com/@kingsleytorlowei/building-a-many-to-many-modelled-rest-api-with-django-rest-framework-d41f54fe372
我的问题是,当我对资产使用“ PATCH”时,什么也没出现。
型号:
class Asset(models.Model):
[...]
vulnerabilities = models.ManyToManyField("Vulnerability",verbose_name="vulnerability",blank=True,)
class Vulnerability(models.Model):
id = models.CharField(max_length=25, primary_key=True)
name = models.CharField(max_length=255, blank=True, null=True)
level = models.PositiveSmallIntegerField()
序列化器:
class VulnerabilitySerializer(serializers.ModelSerializer):
key = serializers.CharField(source='id', read_only=True)
controls = ControlSerializer(read_only=True, many=True)
class Meta:
model = models.Vulnerability
fields = (
'key',
'id',
'name',
'level',
'controls',
)
class AssetSerializer(serializers.ModelSerializer):
key = serializers.CharField(source='id', read_only=True)
class Meta:
model = models.Asset
fields = (
'key',
'id',
'name',
'weight',
'vulnerabilities',
)
depth = 3
当我获取/ api / asset / xxx
{
"key": "xxx",
"id": "xxx",
"name": "aaaaaaaaaaaa",
"weight": 3,
"vulnerabilities": [
{
"id": "V004",
"name": "xazeaze",
"level": 3,
"controls": []
}
]
}
因此,我尝试过帐资产,并且该资产有效:
{
"key": "A099",
"id": "A099",
"name": "Asset 999",
"weight": 10,
"vulnerabilities": [] <---- empty
}
但是,当我要修补/添加漏洞时,什么也没有:
资产ID为“ Axxx” 漏洞ID为“ Vxxx” 作为primary_key
PATCH ./api/asset/A099 数据:
{
"vulnerabilities": ["V001","V002"]
}
它返回一个空漏洞:
{
"key": "A099",
"id": "A099",
"name": "Asset 999",
"weight": 10,
"vulnerabilities": [] <--- still empty
}
我想念什么?