关于“多对多字段/序列化器”问题的DRF PATCH

时间:2020-10-21 15:50:49

标签: django django-rest-framework

更新:序列化程序上的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
}

我想念什么?

0 个答案:

没有答案