我正在创建 REST API。
django==3.2.2
djangorestframework==3.12.4
psycopg2==2.8.6
我是 Django、Python 的新手。 我正在寻找一种在 Django 模型中使用 JSON 字段的方法。 我的模型如下所示 -
class Question(BaseModel):
.... other code...
attributes = models.JSONField()
现在我希望属性是 JSON,如下所示
{
"index": 0,
"guid": "95161b18-75a8-46bf-bb1f-6d1e16e3d60b",
"isActive": false,
"latitude": -25.191983,
"longitude": -123.930584,
"tags": [
"esse",
"sunt",
"quis"
],
"friends": [
{
"id": 0,
"name": "Contreras Weeks"
},
{
"id": 1,
"name": "Dawn Lott"
}
]
}
我应该创建一个新模型,但创建一个新模型会使其添加到我不想要的迁移中。
Django 现在原生支持 JSONField。
我发现 - 我们可以为 Django 使用 Pydantic 或 schema。他们还提供验证。我更喜欢 Pydantic。
编辑
Pydantic 示例
架构:
from typing import List
from pydantic import (
BaseModel,
StrictBool,
StrictInt,
StrictStr,
)
class Foo(BaseModel):
count: int
size: float = None
class Bar(BaseModel):
apple = 'x'
banana = 'y'
class AttributesSchema(BaseModel):
point: StrictInt
value: StrictStr
foo: Foo
bars: List[Bar]
将返回 JSON,例如:
{
'point': 2,
'value': 'Any string'
'foo': {'count': 4, 'size': None},
'bars': [
{'apple': 'x1', 'banana': 'y'},
{'apple': 'x2', 'banana': 'y'},
],
}
验证
将其添加到您的序列化器中:
schema = AttributesSchema
try:
errors = schema.validate(data['attributes'])
except Exception as errors:
raise serializers.ValidationError(errors)
参考Pydantic文档,它有我们需要的一切。