2013-02-12 50 views
6

我想为模型添加dict字段,在管理员上显示dict,并且能够从管理员编辑该字段。字典作为模型字段

例如,我有一个关系

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

其中rel_score(缺省值= 0)是对于每个关系得分。我想将此dict存储到我的模型中,并将其显示在管理员中,以便我可以为管理员上的每个关系分配这些rel_score。另外,如何将分数(优先级)分配给不同的元素,并根据这些分配的分数返回值的任何示例都将非常有用。

+1

可能重复[如何存储在一个Django字典模型?](http://stackoverflow.com/questions/402217/how-to-store-a-dictionary-on-a-django-model) – 2013-02-12 17:44:11

+0

这个问题相当古老。从那以后,django和可用的应用程序都发生了很大的变化,所以现在可能会有新的方法。 – 2015-01-20 08:41:45

+0

你可以使用json字段来表示字典吗? https://github.com/bradjasper/django-jsonfield 其他也有json模式字段的应用程序: https://www.djangopackages.com/grids/g/json-fields/ – 2015-01-20 08:45:05

回答

2

由于底层数据库不支持该类型的数据结构,因此实际上不可能拥有DictField。

您可以通过RelationshipScore模型将您的关系和ForeignKey存储到您的现有模型中(我将以用户为例)。例如:

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

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

然后,您可以添加功能到现有的模型中,得到的值:

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

由于Django的1.8,用户Postgres的也有使用HStore field的选项。

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

Postgres用户可以使用jsonfield easely:

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 

和你的应用程序中:的

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