代码之家  ›  专栏  ›  技术社区  ›  aalberti333

Django中使用JSONField的默认dict列表

  •  2
  • aalberti333  · 技术社区  · 6 年前

    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的callable(例如 函数)。错误地使用default={}会创建一个可变的默认值

    我想提供一份清单 包含

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   MrName    6 年前

    如您引用的摘录所述,您可以使用任何callable作为默认值。因此,您可以创建自己的方法来调用以创建默认值。

    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)