Django帖子列表json

2024-06-24 13:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用JSON发送一个包含更多参数的列表。所有参数都起作用,但列表不起作用,列表保存为空列表。我使用的是Django REST框架和一个嵌套序列化程序。在

这是我的serializers.py

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ('tagID', 'tagName')

class IncentiveSerializer(serializers.ModelSerializer):
    tags=TagSerializer(many=True,read_only=True)
    class Meta:
        model = Incentive
        fields = ('schemeName', 'schemeID','text','typeID','typeName','status','ordinal','tags','modeID',
        'groupIncentive','condition')

这是我的models.py

^{pr2}$

我以JSON格式发送此信息

{
    "schemeName": "SendEmails", 
    "schemeID": 1234, 
    "text": "HelloWorld", 
    "typeID": 345, 
    "typeName": "Emails", 
    "status": true, 
    "ordinal": 0, 
    "tags": [{"tagID":123,"tagName":"dor"}], 
    "modeID": 0, 
    "groupIncentive": false, 
    "condition": "SendEmails"
}

我从服务器上得到的结果是

{
    "schemeName": "SendEmails", 
    "schemeID": 1234, 
    "text": "HelloWorld", 
    "typeID": 345, 
    "typeName": "Emails", 
    "status": true, 
    "ordinal": 0, 
    "tags": [], 
    "modeID": 0, 
    "groupIncentive": false, 
    "condition": "SendEmails"
}

我怎样才能将标签保存为列表?在


Tags: text列表statustagsconditionclassserializersordinal
1条回答
网友
1楼 · 发布于 2024-06-24 13:24:16

Django REST框架忽略了正在发送的tagsIncentiveSerializer上的tags字段被设置为read_only=True,这意味着不能添加标记,它们只能被读取。因此,所有的标记都被忽略,没有任何东西会影响数据库。在

您可以通过设置read_only=False来解决此问题,但这将要求您重写序列化程序上的create和{},并且drf3默认情况下不处理嵌套的序列化程序。Django REST框架文档有some useful information,用于以通用方式实现这些方法,但它很可能特定于序列化程序。在

class IncentiveSerializer(serializers.ModelSerializer):
    tags=TagSerializer(many=True,  read_only=False)

    class Meta:
        model = Incentive
        fields = ('schemeName', 'schemeID','text','typeID','typeName','status','ordinal','tags','modeID',
        'groupIncentive','condition')

    def create(self, validated_data):
        tags_data = validated_data.pop("tags", [])

        # Ignores tags without a tagId
        tags_ids = [tag["tagId"] for tag in tags_data if "tagId" in tag]

        incentive = super(IncentiveSerializer, self).create(validated_data)

        if tags_ids:
            tags = Tag.objects.filter(tagId__in=tags_ids)
            incentive.tags.add(*tags)

        return incentive

这应该允许您在创建Incentive时添加tags,但是它要求标记已经存在并且可以被{}找到。您可能需要更改此项以满足您所要查找的内容,因为嵌套对象的创建和更新非常依赖于情况。在

相关问题 更多 >