python - 在 Django 模型中存储列表的最有效方法是什么?

标签 python django django-models

目前我的代码中有很多 python 对象,类似于以下内容:

class MyClass():
  def __init__(self, name, friends):
      self.myName = name
      self.myFriends = [str(x) for x in friends]

现在我想把它变成一个 Django 模型,其中 self.myName 是一个字符串字段,self.myFriends 是一个字符串列表。

from django.db import models

class myDjangoModelClass():
    myName = models.CharField(max_length=64)
    myFriends = ??? # what goes here?

由于列表是 python 中如此常见的数据结构,我有点期待它有一个 Django 模型字段。我知道我可以使用 ManyToMany 或 OneToMany 关系,但我希望在代码中避免这种额外的间接性。

编辑:

我添加了 related question ,人们可能会觉得有用。

最佳答案

“过早的优化是万恶之源。”

牢记这一点,让我们这样做!一旦您的应用程序达到某个点,非规范化数据就很常见了。如果处理得当,它可以节省大量昂贵的数据库查找,但需要多做一些内务处理。

要返回好友名称的list,我们需要创建一个自定义的 Django Field 类,该类将在访问时返回一个列表。

David Cramer 在他的博客上发布了创建 SeperatedValueField 的指南。代码如下:

from django.db import models

class SeparatedValuesField(models.TextField):
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        self.token = kwargs.pop('token', ',')
        super(SeparatedValuesField, self).__init__(*args, **kwargs)

    def to_python(self, value):
        if not value: return
        if isinstance(value, list):
            return value
        return value.split(self.token)

    def get_db_prep_value(self, value):
        if not value: return
        assert(isinstance(value, list) or isinstance(value, tuple))
        return self.token.join([unicode(s) for s in value])

    def value_to_string(self, obj):
        value = self._get_val_from_obj(obj)
        return self.get_db_prep_value(value)

此代码的逻辑处理将值从数据库序列化和反序列化到 Python,反之亦然。现在您可以轻松地在模型类中导入和使用我们的自定义字段:

from django.db import models
from custom.fields import SeparatedValuesField 

class Person(models.Model):
    name = models.CharField(max_length=64)
    friends = SeparatedValuesField()

关于python - 在 Django 模型中存储列表的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110153/

相关文章:

python - Pandas 数据帧 : how can i compare values in two columns of a row are equal to the ones in the same columns of a subsequent row?

python - Pipenv安装错误: Command "python setup.py egg_info" failed with error code 1 in

javascript - 按下 ENTER 时提交某个按钮

python - Django 模板显示所有用户而不是单个用户的数据

django - 在 Django 中提供文件中的原始动态 html 内容?

python - MySQL、JSON、Python、Django - 完全错误

python-2.7 - 基于另一个字段的模型字段的动态默认值

python - 如何在 pl/python 中对查询的 WHERE 子句进行参数化?

python - 创建 AWS KMS key 时出现 MalformedPolicyDocumentException

django - 如何在Django中计算数据库表中的行数