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

Is there a better way to store a list of integers in a MySQL Model?

我想在 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() 检索它并进行转换 'behind the scenes'.

是否可能(无需迁移到 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 <b>IntegerListField</b>

class myModel(models.Model):
    testList = <b>IntegerListField(max_length=255)</b>

所以现在 Django 将自动包装 Python 世界和数据库世界之间的整数列表。

以上当然是草图。您可能应该阅读 documentation on Writing custom model fields.

所以 "under the hood" 在数据库端,我们仍然使用 VARCHARCharField 在这里使用的任何东西。我们只是在这里添加了一些额外的逻辑,自动将数据库中的值转换为整数列表,并在将它们存储到数据库之前将它们包装成字符串。因此我们没有构造一个新的数据库类型。不过,我认为您可以在模型中使用整数列表更方便。

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

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

理论上,正确的设计应该是一个不同的 table(模型)保存值,在 "master" 模型上有一个外键。这里的好处之一是您可以在相关值上查询主模型...

现在我从经验中知道,对于某些用例(例如,如果您永远不需要查询这些值),这只是简单的矫枉过正(和无用的开销),并且您没有为您的问题提供任何上下文,所以在这里无法判断反规范化是否是一个明智的设计,但我认为这个小提醒可能有用(对你,也对未来的读者)。

PS: 此外,现在越来越多的 rdbms 正在构建(或多或少完整和高效...)支持 json 字段,所以您可能也想检查此解决方案(最终将 JSON 字段包装在自定义字段中以确保您只获得整数列表)。