【问题标题】:Multi-valued field in DjangoDjango中的多值字段
【发布时间】:2018-11-06 12:02:16
【问题描述】:

我不敢相信这以前没有出现过,但是:

如果我希望我的模型有一个具有多个值的“原始”字段,我将如何声明它?例如,多个整数、字符串、布尔值或日期时间。

我最初的想法是使用我的模型的 FK 和我提到的字段之一创建第二个模型:

class MyModel(models.Model):
    pass

class MyModelInteger(models.Model):
    integer = models.ForeignKey(MyModel)
    value = models.IntegerField()

但是 (i) 这是否证明使用第二张桌子是合理的? (ii) 如何直接从MyModel 访问整数值?我不能使用through 选项,因为它适用于中间关联模型,不适用于简单属性。

我可能想多了,但令人惊讶的是,就我的记忆而言,我还没有遇到过这种情况,所以我希望能得到一些帮助来清除它。

【问题讨论】:

    标签: django


    【解决方案1】:

    是的,考虑到整数的顺序在这里并不重要,而这些数字是“实体”,你可以这样做。

    您可以通过以下方式获取项目:

    class MyModel(models.Model):
    
        def my_integers():
            return self.mymodelinteger_set.values_list('value', flat=True)
    
    class MyModelInteger(models.Model):
        integer = models.ForeignKey(MyModel)
        value = models.IntegerField()

    您因此在此处查询value 属性相关 MyModelIntegers。

    如果您想获取所有具有相关整数值的MyModel 对象,例如3,则上述方法也很有用:

    # obtain all MyModels with a related integer that is 3
    MyModel.objects.filter(mymodelinteger__value=3)
    

    但是,如果您只想在模型中存储一些数字,并且您不必过滤这些数字,则上述内容可能有点过头了。在这种情况下,您可以使用 JSONField [Django-doc](这是 PostgreSQL 的特定名称),或者对于非 PostgreSQL,您可以使用 django-jsonfield [GitHub]

    因此,您可以在此处将普通 Python 对象作为 JSON 存储在数据库中,这对于可以动态结构化的少量数据以及过滤器(在 PostgreSQL 的情况下您可以 em> 过滤器)不是必需的。

    然后你可以像这样使用它:

    from jsonfield import JSONField
    # or for PostgreSQL
    # from django.contrib.postgres.fields import JSONField
    
    class MyModel(models.Model):
        integers = JSONField(default=list)

    【讨论】:

      猜你喜欢
      • 2020-10-21
      • 2017-09-11
      • 2013-09-20
      • 2012-08-21
      • 1970-01-01
      • 2014-06-28
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多