Django 许多字段/序列化程序问题上的DRF修补程序

Django 许多字段/序列化程序问题上的DRF修补程序,django,django-rest-framework,Django,Django Rest Framework,更新:序列化程序上初始\u数据和验证的\u数据之间的差异 “弱点”消失了 既然漏洞字段是M2M字段,为什么会有这样的差异 >>> from api.serializers import AssetSerializer >>> serializer = AssetSerializer(data={"key": "A999","id": "A999","name":

更新:序列化程序上初始\u数据和验证的\u数据之间的差异

“弱点”消失了

既然漏洞字段是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条目。 我找到了这篇文章

我遇到的问题是,当我对资产使用“补丁”时,什么都不会出现

型号:

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
}
它返回一个空值:

{
    "key": "A099",
    "id": "A099",
    "name": "Asset 999",
    "weight": 10,
    "vulnerabilities": [] <--- still empty
}
{
“密钥”:“A099”,
“id”:“A099”,
“名称”:“资产999”,
“重量”:10,
“漏洞”:[]
{
    "key": "A099",
    "id": "A099",
    "name": "Asset 999",
    "weight": 10,
    "vulnerabilities": [] <--- still empty
}