【问题标题】:Default list of dicts using JSONField in Django在 Django 中使用 JSONField 的默认字典列表
【发布时间】:2018-08-22 18:05:56
【问题描述】:

Django 2.0、Django-Rest-Framework 3.8、Python 3.6

我正在使用 Postgres 数据库并尝试将以下内容设置为 JSONField 的默认值:

from django.db import models
from django.contrib.postgres.fields import JSONField

class TrainerProfile(models.Model):
    """data required to pull up trainer profile"""

    specific_workouts = JSONField(default=[{"specific": "standard session", "price": 100.00, "units": 1, "hours_per_unit": 1}, {"specific": "standard session", "price": 250.00, "units": 3, "hours_per_unit": 1}, {"specific": "standard session", "price": 300.00, "units": 5, "hours_per_unit": 1}])

    def __str__(self):
        return str(self.specific_workouts)

来自 Django 文档,内容如下:

如果您给该字段一个默认值,请确保它是可调用的,例如 dict (对于空默认值)或返回 dict 的可调用对象(例如 功能)。错误地使用 default={} 创建一个可变的默认值 在 JSONField 的所有实例之间共享。

我想提供一个列表包含 dicts 作为默认值。我可以通过原始数据或 Django Rest Framework 中的可浏览 api 发布字典列表,但我需要知道如何默认设置它。我希望它把它作为默认值发布:

"specific_workouts": [
            {
                "price": 100.0,
                "units": 1,
                "specific": "standard session",
                "hours_per_unit": 1
            },
            {
                "price": 250.0,
                "units": 3,
                "specific": "standard session",
                "hours_per_unit": 1
            },
            {
                "price": 300.0,
                "units": 5,
                "specific": "standard session",
                "hours_per_unit": 1
            }
        ]

我猜我必须重写 save() 才能做到这一点,但我不确定如何实际实现它。非常感谢任何帮助。


更新

我已尝试实现以下内容,但仍返回 null 值作为默认值。

from django.db import models
from django.contrib.postgres.fields import JSONField

def default_specific_workouts():
    return [
        {
            "price": 100.0,
            "units": 1,
            "specific": "standard session",
            "hours_per_unit": 1
        },
        {
            "price": 250.0,
            "units": 3,
            "specific": "standard session",
            "hours_per_unit": 1
        },
        {
            "price": 300.0,
            "units": 5,
            "specific": "standard session",
            "hours_per_unit": 1
        }
    ]

class TrainerProfile(models.Model):
    """data required to pull up trainer profile"""

    specific_workouts = JSONField(default=default_specific_workouts)

    def __str__(self):
        return str(self.specific_workouts)

也值得一提 即使我输入,我仍然返回 null:

specific_workouts = JSONField(default=list)

specific_workouts = JSONField(default=dict)

真的不知道如何从这里开始。

【问题讨论】:

  • 这看起来很傻,但是你运行过迁移吗?保存对象时默认存储为什么...应该是Model中的默认设置

标签: python django django-rest-framework


【解决方案1】:

如您引用的摘录中所述,您可以使用任何可调用对象作为默认值。因此,您可以创建自己的方法来调用以创建默认值。

def default_specific_workouts():
    # You probably want this in a variable, just copy/pasting your sample data
    # to keep the example simple
    return [
        {
            "price": 100.0,
            "units": 1,
            "specific": "standard session",
            "hours_per_unit": 1
        },
        {
            "price": 250.0,
            "units": 3,
            "specific": "standard session",
            "hours_per_unit": 1
        },
        {
            "price": 300.0,
            "units": 5,
            "specific": "standard session",
            "hours_per_unit": 1
        }
    ]

现在你可以这样做了:

specific_workouts = JSONField(default=default_specific_workouts)

【讨论】:

  • 感谢@MrName 的回复,但不幸的是,以这种方式设置时,我仍然会看到null 值。我可能只是误解了设置。我将函数保存在类外,并使用:specific_workouts = JSONField(default=default_specific_workouts()) 调用它
  • 请注意,上面示例中的语法不包括()。换句话说,您传递的是实际的可调用对象,而不是可调用对象的结果。
  • 我明白了,谢谢你的澄清。更改后,我仍然返回一个 null 值作为可浏览 api 中的默认值。
  • 您可以更新您的原始帖子以显示您更新的代码吗?在这里要测试的第一件事是,如果您的方法自己调用它,它实际上确实会返回该值。
  • 最近更新了,抱歉回复延迟。任何反馈表示赞赏。
猜你喜欢
  • 2017-07-03
  • 2016-03-25
  • 2011-06-29
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2019-10-08
相关资源
最近更新 更多