在 Django 中使用 JSONField 的默认字典列表



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 (对于空默认值(或返回字典的可调用对象(例如 函数(。错误地使用 default={} 会创建一个可变的默认值 在 JSONField 的所有实例之间共享。

我想提供一个包含字典的列表作为默认值。我可以通过原始数据或 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()才能做到这一点,但我不确定如何实际实现它。任何帮助将不胜感激。


更新

我已经尝试实现以下内容,但仍然返回一个空值作为默认值。

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)

另外值得一提的是,即使我输入:

specific_workouts = JSONField(default=list)

specific_workouts = JSONField(default=dict)

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

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

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)

最新更新