1

我想在 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)?

4

2 回答 2

1

您可以定义自己的 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)

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

以上当然是原始草图。您可能应该阅读有关编写自定义模型字段的文档。

因此,在数据库端的“幕后”,我们仍然使用 aVARCHARCharField这里使用的任何东西。我们只是在这里添加了一些额外的逻辑,它会自动将数据库中的值转换为整数列表,并在将它们存储到数据库之前将它们包装成字符串。因此,我们没有构建新的数据库类型。但是,我认为您可以在模型上使用整数列表更方便。

于 2019-08-12T09:46:50.553 回答
1

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

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

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

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

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

于 2019-08-12T10:37:12.923 回答