2013-02-12 10 views
6

Ich möchte ein dict Feld zu einem Modell hinzufügen, das dict auf dem Admin anzeigen und in der Lage sein, es vom Administrator zu bearbeiten.Dict als Modellfeld

Zum Beispiel habe ich eine Beziehung

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

wo rel_score (default = 0) ist die Punktzahl für jede Beziehung. Ich möchte dieses dict zu meinem Modell speichern und es in admin anzeigen, damit ich diese rel_score für jede Beziehung auf meinem admin zuweisen kann.

Auch ein Beispiel, wie man den verschiedenen Elementen Punkte zuordnet (priorisiert) und die Werte entsprechend diesen zugewiesenen Werten zurückgibt, wäre sehr hilfreich.

+1

möglich Duplikat [Wie ein Wörterbuch auf einem Django speichern Modell?] (Http://stackoverflow.com/questions/402217/how-to-store-a-dictionary-on-a-django-model) –

+0

Diese Frage ist ziemlich alt. Sowohl Django als auch die verfügbaren Apps haben sich seither stark verändert, so dass es jetzt neue Ansätze geben könnte. –

+0

Könnten Sie ein JSON-Feld verwenden, um das Diktat darzustellen? https://github.com/bradjasper/django-jsonfield Andere apps, die auch json modelfields haben: https://www.djangopackages.com/grids/g/json-fields/ –

Antwort

2

Es ist nicht wirklich möglich, ein DictField zu haben, da die zugrunde liegende Datenbank diese Art von Datenstruktur nicht unterstützt.

Sie könnten ein RelationshipScore-Modell haben, um Ihre Beziehungen und einen ForeignKey von diesem zu Ihrem bestehenden Modell zu speichern (ich benutze den Benutzer als Beispiel). zB:

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

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

Sie könnten dann Funktionen zu Ihrem bestehenden Modell hinzufügen, um die Werte zu erhalten:

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

Ab Django 1.8, Posgresbenutzer haben auch die Möglichkeit, eine HStore field verwenden.

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

Postgres Benutzer kann die jsonfield easely verwenden:

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 

und innerhalb Ihrer 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