Django中的多值字段

时间:2018-11-06 12:02:16

标签: django

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

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

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

class MyModel(models.Model):
    pass

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

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

我可能对此想法太过思索,但令人惊讶的是,就我的记忆而言,我还没有遇到这种情况,因此,我希望能有一些帮助来清除它。

1 个答案:

答案 0 :(得分: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的{​​{1}}属性。

例如,如果您想获取具有相关整数值(例如MyModelInteger)的所有MyModel对象,则上述内容也很有用:

3

但是,如果您只想在模型中存储一些数字,而不必过滤这些数字,则上述方法可能会过大。在这种情况下,您可以使用JSONField [Django-doc](这是PostgreSQL的特定版本),或者对于非PostgreSQL,则可以使用django-jsonfield [GitHub]

因此,您可以在此处将原始的Python对象作为JSON存储在数据库中,这对于可动态结构化的少量数据以及在何处使用过滤器(对于您可以使用PostgreSQL的情况过滤器)。

然后您可以像使用它一样

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