Django 有没有更好的方法在MySQL模型中存储整数列表?

Django 有没有更好的方法在MySQL模型中存储整数列表?,django,django-mysql,Django,Django Mysql,我想在MySQL字段中存储一个整数列表 我当前的解决方法: import datetime from django.db import models class myModel(models.Model): testList = models.CharField() def set_testList(self,data): self.testList = ','.join(map(str, data)) def get_testList(self):

我想在MySQL字段中存储一个整数列表

我当前的解决方法:

import datetime
from django.db import models

class myModel(models.Model):
    testList = models.CharField()

    def set_testList(self,data):
        self.testList = ','.join(map(str, data))

    def get_testList(self):
        return list(map(int, self.testField.split(',')))
只要我通过set_testList和get_testList来设置和检索字段,这就可以正常工作

这变得特别烦人,因为我在一些模型中有4-5个这样的字段,并且必须通过它们自己的set和get方法设置和检索每个字段,这使得代码的可读性大大降低,并增加了数据库查询

有没有可能创建一个解决方案,而不必通过自定义方法来实现这一点

最佳情况是使用以下命令设置字段:
myModel.objects.create(testField=[1,2,3,4])
;然后使用myModelobjects.get(pk=1.values()检索它,并在“幕后”进行转换


这样做是否可行(无需迁移到PostgreSQL)?

您可以定义自己的Django模型字段,如:

# app/fields.py

from django.db import models

class IntegerListField(models.CharField):

    description = 'list of integers'

    def from_db_value(self, value, expression, connection):
        if value is None:
            return None
        return list(map(int, value.split(',')))

    def to_python(self, value):
        if isinstance(value, list):
            return value
        if value is None:
            return None
        return list(map(int, value.split(',')))

    def get_prep_value(self, value):
        if value is None:
            return None
        return ','.join(map(str, value))
然后可以在模型中使用该字段:

# app/models.py

import datetime
from django.db import models
from app.fields import IntegerListField

class myModel(models.Model):
    testList = IntegerListField(max_length=255)
#app/models.py
导入日期时间
从django.db导入模型
从app.fields导入IntegerListField
类myModel(models.Model):
testList=IntegerListField(最大长度=255)
现在Django将自动在Python世界和数据库世界之间包装整数列表

以上当然是一个原始草图。你也许应该读一下这本书


所以在数据库端的“引擎盖下”,我们仍然使用
VARCHAR
或这里使用的任何
CharField
。我们只是在这里添加了一些额外的逻辑,它自动将数据库中的值转换为整数列表,并在将这些值存储到数据库之前将它们包装为字符串。因此,我们没有构造新的数据库类型。然而,我认为在模型上使用整数列表更方便。

虽然从纯技术角度来看,Willem的答案非常好而且完全正确,但我想补充一点,这个问题本身就暗示了一个可能的数据库设计问题

您使用的是一个关系数据库,而不仅仅是一个比特桶,关系建模规则规定字段应该是原子的(一个字段应该只存储一个原子值),而这种解决方案不再是这种情况

理论上,正确的设计应该是一个保存值的独特表(模型),在“主”模型上有一个外键。这里的好处之一是,您可以在相关的一个值上查询主模型

现在我从经验中知道,对于某些用例(例如,如果您不需要查询这些值的话)来说,这完全是多余的(和无用的开销),并且您没有为您的问题提供任何上下文,因此不可能判断反规范化在这里是否是一个合理的设计,但我认为这个小提示可能有用(为你,也为未来的读者)


PS:此外,现在越来越多的rdbms正在构建(或多或少地完整和性能…)对json字段的支持,因此您可能也希望检查此解决方案(最终将json字段包装为自定义字段,以确保只获得整数列表).

您可以将
CharField
子类化,为您进行包装。