【发布时间】: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