Dict作为模型领域

时间:2013-02-12 16:07:28

标签: django django-models python-2.7 django-admin

我想在模型中添加dict字段,在管理员上显示dict,并且可以从管理员进行编辑。

例如,我有一段感情

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

其中rel_score(默认= 0)是每个关系的分数。我想将此dict存储到我的模型中并将其显示在admin中,以便我可以为管理员的每个关系分配这些rel_score。

此外,如何将分数(优先级)分配给不同的元素,并根据这些分配的分数返回值将是非常有用的。

3 个答案:

答案 0 :(得分: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 :(得分:1)

从Django 1.8开始,postgres用户也可以选择使用HStore field

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

答案 2 :(得分:0)

Postgres用户可以轻松使用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

并在您的应用内:

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