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)