2013-02-12 13 views
6

Desidero aggiungere un campo dict a un modello, visualizzare dict sull'amministratore ed essere in grado di modificarlo dall'amministratore.Dict come campo modello

Ad esempio, ho un rapporto

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

dove rel_score (default = 0) è il punteggio per ciascun rapporto. Voglio memorizzare questo dict nel mio modello e visualizzarlo in admin, in modo da poter assegnare questi rel_score per ogni relazione sul mio amministratore.

Inoltre, qualsiasi esempio di come assegnare punteggi (priorità) a diversi elementi e restituire valori in base a questi punteggi assegnati sarebbe davvero utile.

+1

possibile duplicato di [Come conservare un dizionario su un Django Modello?] (Http://stackoverflow.com/questions/402217/how-to-store-a-dictionary-on-a-django-model) –

+0

Questa domanda è abbastanza vecchia. Sia django che le app disponibili sono cambiate molto da allora, quindi ora potrebbero esserci nuovi approcci. –

+0

Potresti usare un campo JSON per rappresentare il dict? https://github.com/bradjasper/django-jsonfield Altre app che dispongono anche di json modelfields: https://www.djangopackages.com/grids/g/json-fields/ –

risposta

2

Non è davvero possibile avere un DictField poiché il database sottostante non supporta quel tipo di struttura dati.

Si potrebbe avere un modello di RelationshipScore per memorizzare le relazioni e una Chiave Straniera da esso al modello esistente (userò l'utente come esempio). ad esempio:

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

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

È quindi possibile aggiungere funzioni al modello esistente per ottenere i valori:

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

Come di Django 1.8, Postgres gli utenti hanno anche la possibilità di utilizzare un HStore field.

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

Postgres utente può utilizzare l'easely jsonfield:

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 

e all'interno della vostra app:

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