gpt4 book ai didi

python - 允许在 Django Rest Framework 序列化器字段名称中使用连字符

转载 作者:行者123 更新时间:2023-12-02 00:54:25 25 4
gpt4 key购买 nike

鉴于我正在编写代码的 OpenAPI 规范要求在请求正文中使用连字符大小写(又名 kebab-case)变量名称,在使用 Django Rest Framework 时应该如何处理?

例如,一个请求 POST /thing创建一个具有这个主体的事物:

{
"owner-type": "platform"
}

但是在 Python 中, owner-type不是一个有效的变量名(“SyntaxError: can't assign to operator”),所以取而代之的是 Thingowner_type在模型定义中:

class Thing(models.Model):
owner_type = models.CharField(max_length=8)

但现在 ThingSerializer是有问题的,因为,再次, owner-type是非法名称。这是不允许的:

    owner-type = serializers.CharField(...)

我试图覆盖 ModelSerializer 中名称的生成方式通过尝试调整 get_fields() 生成的字段名称,但失败了。这是我的序列化程序:

class ThingSerializer(serializers.ModelSerializer):
class Meta:
model = Thing
fields = [
'owner_type',
]

def get_fields(self):
fields = super().get_fields()
out_fields = OrderedDict()
for field_name, field in fields.items():
out_fields[field_name.replace('_', '-')] = field
return out_fields

和错误:
../venv/lib/python3.6/site-packages/rest_framework/fields.py:453: in get_attribute
return get_attribute(instance, self.source_attrs)
../venv/lib/python3.6/site-packages/rest_framework/fields.py:101: in get_attribute
instance = getattr(instance, attr)
E AttributeError: 'Thing' object has no attribute 'owner-type'

所以我的问题 - 如何配置 DRF 模型序列化器以允许包含下划线的模型字段被序列化/反序列化,以便 API 客户端看到连字符而不是下划线?这将是上述示例的通用解决方案,其中 Thing.owner_type应该通过传递字段 "owner-type" 来读取/写入在 JSON 正文中。

我在 Python 3.6 上使用最新的 Django 和 DRF。

编辑 1:澄清理想情况下,这将是将下划线转换为连字符的通用解决方案。

最佳答案

您可以在 fields 中使用连字符定义字段名称并通过定义 source 将其映射到正确的 django 模型字段extra_kwargs 中的属性- 见 https://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments

要回答你的问题,你定义 ThingSerializer如下:

class ThingSerializer(serializers.ModelSerializer):
class Meta:
model = Thing
fields = [
'owner-type',
]
extra_kwargs = {
'owner-type': {'source': 'owner_type'},
}

关于python - 允许在 Django Rest Framework 序列化器字段名称中使用连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55534231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com