Skip to main content
 首页 » 编程设计

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

2024年09月07日31kuangbin

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 文档中,它是这样写的:

If you give the field a default, ensure it’s a callable such as dict (for an empty default) or a callable that returns a dict (such as a function). Incorrectly using default={} creates a mutable default that is shared between all instances of 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)