【问题标题】:Dict as a model field字典作为模型字段
【发布时间】:2013-01-28 00:04:51
【问题描述】:

我想在模型中添加一个dict 字段,在管理员中显示dict,并能够从管理员中对其进行编辑。

比如我有关系

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

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

此外,任何关于如何为不同元素分配分数(优先级)并根据这些分配的分数返回值的示例都会非常有帮助。

【问题讨论】:

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


【解决方案1】:

实际上不可能有 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]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 2021-08-25
        相关资源
        最近更新 更多