2013-02-12 5 views
6

Je souhaite ajouter un champ dict à un modèle, afficher le dict sur l'admin, et pouvoir le modifier depuis l'admin.Dict en tant que champ de modèle

Par exemple, j'ai une relation

dict = { 'sister' : rel_score, 'mother' : rel_score, 'father': rel_score}

rel_score (valeur par défaut = 0) est le score pour chaque relation. Je veux conserver ce dict à mon modèle et l'afficher dans l'admin, pour que je puisse attribuer ces rel_score pour chaque relation sur mon administration.

En outre, aucun exemple de la façon d'attribuer des notes (priorité) à des éléments différents, et les valeurs de retour en fonction de ces notes attribuées serait vraiment utile.

+1

double possible de [Comment stocker un dictionnaire sur un Django modèle?] (http://stackoverflow.com/questions/402217/how-to-store-a-dictionary-on-a-django-model) –

+0

Cette question est assez ancienne. Les deux django et les applications disponibles ont beaucoup changé depuis lors, il pourrait donc y avoir de nouvelles approches maintenant. –

+0

Pourriez-vous utiliser un champ json pour représenter la dict? https://github.com/bradjasper/django-jsonfield D'autres applications qui ont également JSON modelfields: https://www.djangopackages.com/grids/g/json-fields/ –

Répondre

2

Il n'est pas vraiment possible d'avoir une DictField depuis la base de données sous-jacente ne supporte pas ce type de structure de données.

Vous pourriez avoir un modèle RelationshipScore pour stocker vos relations et un ForeignKey de celui-ci à votre modèle existant (je vais utiliser l'utilisateur comme un exemple). par exemple:

Class RelationshipScore(models.Model): 
    user = models.ForeignKey(User) 

    relationship = models.CharField(max_length=50, primary_key=True) 
    score = models.IntegerField() 

Vous pouvez ensuite ajouter des fonctions à votre modèle existant pour obtenir les valeurs:

class User(models.Model): 
    def get_relationship(self, rel): 
     return RelationshipScore.objects.get(relationship=rel, user=self) 
    def get_lowest_relationship(self): 
     return RelationshipScore.objects.filter(user=self).order_by("-score")[0] 
1

A partir de Django 1.8, postgres utilisateurs ont également la possibilité d'utiliser un HStore field.

A field for storing mappings of strings to strings. The Python data type used is a dict. 
0

Postgres utilisateur peut utiliser le jsonfield facilment:

from django.db import models 

from django.contrib.postgres.fields import JSONField 
import json 

class Yourmodel(models.Model): 
    name = models.CharField() 
    dict_json = JSONField(blank=True, null=True) 
    def __str__(self):    
     return self.name 

et dans votre application:

the_dict = {'a':1,'b':2} 
Yourmodel.dict_json = json.dumps(the_dict) 
Yourmodel.save() 

https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#jsonfield

Questions connexes