在模型中使用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"
}
]
}

我应该创建一个新模型,但创建一个新模型会增加迁移,而我不希望这样做。

  1. 如何为上述内容创建模型
  2. 如何使用Django ORM提供的默认验证

我发现了-我们可以对django使用pydantic或schema。他们还提供验证。我更喜欢pydantic。

  1. https://github.com/keleshev/schema
  2. 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/

Django现在本机支持JSONField。