【问题标题】:Is there a better way to store a list of integers in a MySQL Model?有没有更好的方法在 MySQL 模型中存储整数列表?
【发布时间】:2019-12-18 21:23:26
【问题描述】:

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

【问题讨论】:

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

标签: django django-mysql


【解决方案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 世界和数据库世界之间的整数列表。

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

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

【讨论】:

    【解决方案2】:

    虽然从纯技术 POV 来看,Willem 的回答非常棒且完全正确,但我想补充一点,问题本身表明可能存在数据库设计问题。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2014-01-29
      • 2017-01-28
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      相关资源
      最近更新 更多