4 votes

Liste par défaut des dicts en utilisant JSONField dans Django

Django 2.0, Django-Rest-Framework 3.8, Python 3.6

J'utilise une base de données Postgres et j'essaie de configurer ce qui suit comme valeur par défaut pour le 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)

Dans la documentation de Django, il est écrit :

Si vous donnez au champ une valeur par défaut, assurez-vous qu'il s'agit d'un appelable tel que dict (pour une valeur par défaut vide) ou un appelable qui renvoie un dict (comme une fonction fonction). L'utilisation incorrecte de default={} crée une valeur par défaut mutable qui qui est partagée par toutes les instances de JSONField.

Je veux fournir une liste contenant par défaut. J'ai le droit d'afficher une liste de dicts par le biais des données brutes ou de l'api navigable de Django Rest Framework, mais j'ai besoin de savoir comment configurer cela par défaut. Je veux qu'il affiche ceci par défaut :

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

Je suppose que je dois passer outre save() pour le faire, mais je ne suis pas sûr de savoir comment l'implémenter. Toute aide est la bienvenue.


Mise à jour

J'ai essayé de mettre en œuvre ce qui suit et je reçois toujours une valeur nulle par défaut.

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)

A noter également On me renvoie toujours null même si je mets :

specific_workouts = JSONField(default=list)

o

specific_workouts = JSONField(default=dict)

Je ne sais vraiment pas comment procéder à partir de là.

3voto

MrName Points 1210

Comme décrit dans l'extrait que vous avez cité, vous pouvez utiliser n'importe quel callable comme valeur par défaut. En tant que tel, vous pouvez créer votre propre méthode à appeler pour créer la valeur par défaut.

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
        }
    ]

Maintenant, vous pouvez le faire :

specific_workouts = JSONField(default=default_specific_workouts)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X