Python Django中使用JSONField的默认DICT列表

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""

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"""

    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
。您可以更新原始帖子以显示更新的代码吗?这里要测试的第一件事是,如果您自己调用方法,它实际上会返回值。最近更新,很抱歉响应延迟。非常感谢您的反馈。这看起来很愚蠢,但您是否运行过迁移?保存对象时的默认存储方式是什么。。。它应该是模型中的默认设置