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à.