Django现在本机支持JSONField。
我正在创建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 ORM提供的默认验证
我发现了-我们可以对django使用pydantic或schema。他们还提供验证。我更喜欢pydantic。
- https://github.com/keleshev/schema
- https://pydantic-docs.helpmanual.io/
编辑
Pydentic示例
架构
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文件,它拥有我们所需要的一切。https://pydantic-docs.helpmanual.io/usage/types/