Python Django中使用JSONField的默认DICT列表
Django 2.0、Django Rest框架3.8、Python 3.6 我正在使用Postgres数据库,并尝试将以下内容设置为JSONField的默认值:Python Django中使用JSONField的默认DICT列表,python,django,django-rest-framework,Python,Django,Django Rest Framework,Django 2.0、Django Rest框架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""
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的所有实例之间共享
我想提供一个包含默认dict的列表。我可以通过原始数据或Django Rest框架中可浏览的api发布DICT列表,但我需要知道默认情况下如何设置。我希望它将此作为默认设置发布:
"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)
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=list)
或
真的不知道如何从这里开始。如您引用的摘录中所述,您可以使用任何可调用项作为默认值。因此,您可以创建自己的方法来调用以创建默认值
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)
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\u workouts=JSONField(default=default\u specific\u workouts())
注意,在我上面的示例中,语法排除了()
。换句话说,您传递的是实际的可调用项,而不是可调用项的结果。我明白了,谢谢您的澄清。更改后,我仍然会在可浏览的api中返回一个默认值null
。您可以更新原始帖子以显示更新的代码吗?这里要测试的第一件事是,如果您自己调用方法,它实际上会返回值。最近更新,很抱歉响应延迟。非常感谢您的反馈。这看起来很愚蠢,但您是否运行过迁移?保存对象时的默认存储方式是什么。。。它应该是模型中的默认设置