我不敢相信这没出现过,但是:
如果我希望我的模型具有一个带有多个值的“原始”字段,那么该如何声明呢?例如,多个整数,字符串,布尔值或日期时间。
我最初的想法是使用模型的FK和我提到的字段之一创建第二个模型:
class MyModel(models.Model):
pass
class MyModelInteger(models.Model):
integer = models.ForeignKey(MyModel)
value = models.IntegerField()
但是(i)这是否证明使用第二张表是合理的? (ii)如何直接从MyModel
访问整数值?我不能使用through
选项,因为它适用于中间关联的模型,而不是简单的属性。
我可能对此想法太过思索,但令人惊讶的是,就我的记忆而言,我还没有遇到这种情况,因此,我希望能有一些帮助来清除它。
答案 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)