在模型中使用 Django JSONField

问题描述 投票:0回答:2

我正在创建 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 提供的默认验证?
python django postgresql django-models django-rest-framework
2个回答
9
投票

Django 现在原生支持 JSONField


3
投票

我发现 - 我们可以为 Django 使用 Pydanticschema。他们还提供验证。我更喜欢 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文档,它有我们需要的一切。

© www.soinside.com 2019 - 2024. All rights reserved.