Comment stocker un dictionnaire dans un Django modèle de base de données du champ
J'ai besoin d'enregistrer un dictionnaire dans un modèle de champ. Comment dois-je faire?
Par exemple, j'ai ce code:
def create_random_bill(self):
name_chars = re.compile("[a-zA-Z0-9 -_]")
bill_name = "".join(random.choice(name_chars for x in range(10)))
rand_products = random.randint(1,100)
for x in rand_products:
bill_products =
new_bill = Bill.new(name=bill_name, date=datetime.date, products=bill_products)
new_bill.save()
Que dois-je écrire pour "bill_products=" de sorte qu'il économise quelques aléatoire des produits, à partir de mon modèle de Produit à ce projet de loi?
C'est le projet de loi de la description du modèle:
class Bill(models.Model):
name = models.CharField(max_length=255)
date = models.DateTimeField(auto_now_add=True)
products = models.ManyToManyField(Product, related_name="bills")
Et aussi le produit de la description du modèle:
class Product(models.Model):
name = models.CharField(max_length=255)
price = models.IntegerField()
Si il y a autre chose que je devrais ajouter il suffit de laisser un commentaire. Merci!
- Ce que le diable est un "python modèle de base de données"? Êtes-vous l'utilisation d'un ORM ou cadre? cela ressemble un peu "django-ish'
- Oui c'est Django. Je viens juste de commencer à travailler avec elle donc je pourrais mélanger "Python" avec "Django". Je vais changer le titre.
Vous devez vous connecter pour publier un commentaire.
Probablement le plus propre chose à faire serait de créer une autre table "Produits" et ont un plusieurs-à-plusieurs relations. (Voir ici: https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relationships . Dans les docs qu'ils utilisent l'exemple de la pizza, ayant beaucoup de garnitures.)
L'autre option serait de sérialiser vos bill_products. Dans ce cas, vous feriez quelque chose comme:
Ce serait en dehors de la boucle for (bien que, dans l'exemple ci-dessus, rand_products est qu'une seule valeur, de sorte que vous aurez besoin de le corriger).
Je viens de découvrir la django-jsonfield paquet, qui
Ressemble à une option viable pour atteindre ce que vous voulez.
Un moyen pratique pour stocker une représentation JSON dans un modèle est d'utiliser un champ personnalisé de type:
J'ai sauvé ce utils/fields.py et dans mon modèle
from utils.fields import JSONField
. Il y a beaucoup plus de goodies dans la django-ennuyeux application, qui est l'endroit où cet extrait est venu.À l'aide d'un type de champ personnalisé est ma solution préférée - je préfère avoir quelques lignes de code personnalisé que l'appui de l'ensemble de la 3ème partie de la bibliothèque pour un seul type de champ. Tony Abou-Assaleh a une excellente solution, mais ne fonctionne pas pour les versions plus récentes de Django.
Ceci est vérifié pour fonctionner avec Django 1.10.4
Vous pouvez utiliser la sérialisation/désérialisation de pickle module:
http://docs.python.org/library/pickle.html
Si postgres est votre backend, envisager la hstore champ de la prise en charge native de django
Je pense que j'aurais créer le champ en tant que modèles.CharField() et puis l'encoder le dictionnaire comme une chaîne JSON et enregistrer cette chaîne dans la base de données. Ensuite, vous pouvez décoder la chaîne JSON de retour dans un dictionnaire quand vous le lire.