微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 django rest 框架中的 JSONField 中删除额外数据?

如何解决如何从 django rest 框架中的 JSONField 中删除额外数据?

我有一个这样的模型:

class Things(models.Model):
    data = models.JSONField(default=dict)

data 的结构是这样的:

{
   "item" : "sugar","quantity" : "2","cost" : 220
}

请注意,data 不必包含所有 3 个键,它们都是可选的。

困难的部分是,除了这 3 个键之外,我不希望任何其他键出现在 data 字段中。

创建序列化程序有助于确保这 3 个字段的存在和格式,但不能确保其他字段不存在。我怎样才能在 django rest 框架中实现这个东西?

解决方法

您可以验证序列化程序中的字段:

class ThingsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Things
        fields = ['data']

    def validate_data(self,value):
        # You can validate,clean and change your data
        final_data = {
            "item": value.get("item"),"quantity": value.get("quantity"),"cost": value.get("cost",0)
        }
        return final_data

您还可以为您的数据字段创建一个单独的序列化程序并将值传递给它,验证那里的每个字段并返回最终数据。但是,如果您的字段有限且简单,则应该这样做。

,

通过在序列化程序级别使用 validate_<field_name>,您还可以创建一个逻辑来确保 data 中的所有字段都需要填写。

class ThingsSerializer(serializers.ModelSerializer):
     data = serializers.JSONField()
 
     class Meta:
         model = Things
         fields = ('data',)
 
     def validate_data(self,data):
         valid_keys = ('item','quantity','cost')
         errors = []
         out_data = {}
 
         for key in valid_keys:
             if key in data.keys():
                 if data.get(key):
                     out_data[key] = data.get(key)
                 else:
                     errors.append({key: 'This field should be filled.'})
             else:
                 errors.append({key: 'This field is required'})
 
         if len(errors) > 0:
             raise serializers.ValidationError(errors)
         return out_data

这里是测试:

In [25]: s = ThingsSerializer(data={'data': {'item': 'sugar','quantity': 2,'cost': 20}})

In [26]: s.is_valid()
Out[26]: True

In [27]: s.errors
Out[27]: {}



In [28]: s = ThingsSerializer(data={'data': {'item': 'sugar','quantity': 2}})

In [29]: s.is_valid()
Out[29]: False

In [30]: s.errors
Out[30]: {'data': [{'cost': ErrorDetail(string='This field is required',code='invalid')}]}



In [34]: s = ThingsSerializer(data={'data': {'item': 'sugar','cost': None}})

In [35]: s.is_valid()
Out[35]: False

In [36]: s.errors
Out[36]: {'data': [{'cost': ErrorDetail(string='This field should be filled.',code='invalid')}]}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。