【问题标题】:Django - post request body additional data from drf serializerDjango - 从 drf 序列化程序发布请求正文附加数据
【发布时间】:2022-10-30 16:57:51
【问题描述】:

我需要用户以这种格式向我发送数据。 “data”中的每个项目,mast 都包含“mandatory_key”,他们可以另外发送他们想要的任何其他密钥。

{
    "data": [
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... },
        { "mandatory_key": "Value", "key_1": "value_1", "key_2": "value_2", "key_3": "value_3", ... }
    ]
}

因为“mandatory_key”是我知道的唯一键,所以我可以像这样制作我的序列化程序。

class MySerializer(Serializer):
    mandatory_key = CharField()

当我使用数据属性启动此序列化程序时,在验证数据中,它只给我mandatory_key,而不是其他键。

serializer = MySerializer(data=request.data)
if serializer.is_valid():
    print(serializer.validated_data)

有什么方法可以使用序列化程序来做到这一点?我不想手动验证它。因为用例有很大不同。 谢谢!

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

    由于您收到的一个密钥是强制性的,并且模型中的其余密钥可能是空白=True 和 null=True,因此您可以执行以下操作:

    from rest_framework import serializers
    
    class MySerializer(serializers.ModelSerializer):
        class Meta:
            model = MyModel
            fields = "__all__"
    
    

    这应该可以,但请确保在模型中定义其他模型字段时不是必需的

    【讨论】:

    • 我没有使用 ModelSerializer。而且我不知道用户会发送哪些密钥,密钥可以是任何东西。所以我无法预定义它们。
    【解决方案2】:

    您首先需要在序列化程序中使用自定义的 create() 或 update(),然后您可以通过访问上下文数据找到额外的字段。例如,您可以通过执行以下操作获取所有可用的字段:

    def create(self, validated_data):
       fields = self.context["request"].data
    

    然后,您将获得一个对象,该对象显示从请求发送的所有字段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多