【问题标题】:How to make nested jsonb model with django / postgres?如何使用 django/postgres 制作嵌套的 jsonb 模型?
【发布时间】:2021-01-12 17:15:04
【问题描述】:

我要制作的模型类似于youtube api模型。

{ 
 "videos": [
  {
   "id": "7lCDEYXw3mM",
   "snippet": { 
    "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
    "title": "Google I/O 101: Q&A On Using Google APIs",
    "categoryId": "28"
   },
   "statistics": {
    "viewCount": "3057",
    "likeCount": "25",
    "dislikeCount": "0",
    "favoriteCount": "17",
    "commentCount": "12"
   }
  }
 ]
}

我尝试使用ArrayField,但是当我将字段列表发布到数组中时,我一直收到此错误:

"Expected a list of items but got type \"dict\"."

这是目前的模型

class Menu(models.Model):
    burgers = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
        default=None
    )
    beverages = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
        default=None
    )
    extras  = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
        default=None
    )
    fries = ArrayField(
        ArrayField(
            models.CharField(max_length=10, blank=True),
            size=8,
        ),
        size=8,
        default=None
    )

我想让 Array 中的每个项目都有自己的 nameprice 字段。

{
   "burgers": [
     0:{
       "name":"Plain patty",
       "price":4
     },
     1:{
       "name":"Cheese buns",
       "price":8
     }
    ]
}

我怎样才能使用jsonb

【问题讨论】:

  • django.contrib.postgres.fields.JSONField is deprecated. Support for it (except in historical migrations) will be removed in Django 我做了,但它说它被贬低了。
  • @MikiyasAyele:你应该从django.db.models导入JSONFielddocs.djangoproject.com/en/3.1/ref/models/fields/…
  • 正如威廉所说,将JSONField 导入为from django.db.models import JSONField

标签: django postgresql django-rest-framework jsonb


【解决方案1】:

您可以使用JSONField [Django-doc] 将 JSON 存储在模型中:

class Menu(models.Model):
    burgers = models.JSONField()
    beverages = models.JSONField()
    extras = models.JSONField()
    fries = models.JSONField()

话虽如此,存储 JSON Blob 并不是一个好主意,尤其是在使用关系数据库时。通常定义额外的模型,您可以使用ForeignKey [Django-doc]ManyToManyField [Django-doc] 等关系来定义关系。这也确保了参照完整性以及结构完整性

【讨论】:

  • 你也可以使用JSON字段验证它,这真的很重要towardsdatascience.com/…
  • @DevangHingu:问题之一是当您保存模型对象时,Django 的验证器不会运行。仅当您使用模型表单时。因此,这意味着不能保证验证。因此,关系数据库强制这一点。此外,它还可以方便地引用同一个对象:因此您可以拥有两个或多个具有相同 burgerMenus。使用 JSON 时,问题就更大了,因为如果更新了其中一个汉堡,那么 JSON blob 中具有相同数据的其他汉堡就不会更新。对于mongo数据库,确实比较方便,一个用djongo
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 2023-01-12
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2017-07-13
  • 1970-01-01
相关资源
最近更新 更多