python - Django small bytestrings on model,建模应该使用什么类型?

标签 python django python-3.x django-models character-encoding

我有一个模型,我想在其中存储一些小的(2-4 字节)字节字符串(例如:b'foo'b'\x02').我想知道在我的 Django 模型上为它们建模的最佳方法。我以为我可以使用 CharField,但这似乎并没有像我预期的那样工作。 BinaryField 似乎确实有效,但我不确定它是否适合短长度的字段(同样,通常为 2-4 字节)

给定模型:

class Foobar(models.Model):
    charfield = models.CharField(max_length=10)
    binaryfield = models.BinaryField()

当我这样做时:

>>> fb1 = Foobar()
>>> fb1.charfield = b'\0000'
>>> fb1.binaryfield = b'\0000'
>>> fb1.save()

然后读回记录:

>>> read = Foobar.objects.get(id=fb1.id)
>>> read.charfield == b'\0000'
False
>>> read.binaryfield == b'\0000'
True

我希望两个相等性检查都为真。此外,the docs似乎表明不允许在 Binaryfield 上过滤查询集(这是我需要能够做的事情)。话虽如此,它似乎对我有用:

>>> Foobar.objects.filter(binaryfield__in=[b'\0000', b'blarg'])
<QuerySet [<Foobar: Foobar object>]>

我是否遗漏了有关 CharField 的信息? BinaryField 是合适的选择吗?或者有更好的选择吗?

以防万一,我使用的是 Django 1.11(目前最新的 LTS 版本),这是一个在 Python 3.6 上运行的项目。

最佳答案

BinaryField 是正确的选择——从 Django 2.1 开始。不幸的是,您是对的,在此之前,文档包含关于“不可能在 BinaryField 值上过滤查询集”的警告。鉴于您能够做到这一点,您可能想要调查并了解这里的局限性。

将普通字节串传递给 CharField 绝对是错误的。 Django 会在为数据库编码之前将您的字节字符串隐式转换为 Unicode,这会产生错误。例如,有些字节序列不是有效的 utf-8 表示:尝试 Foobar.objects.create(charfield=b'\xf8')

另一种选择是自己显式编码字节域(例如,编码为十六进制字符),可能是通过创建自定义字段。但是,每当您使用 filter() 时,您都必须做同样的事情。丑。

所以尝试让 BinaryField 工作。

关于python - Django small bytestrings on model,建模应该使用什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52616549/

相关文章:

django - 将参数传递给 PyCharm 自定义管理命令

python - 多维数组到字典

python - Pandas :在MultiIndex数据框中的每个索引之后添加一个空行

Python复制文件但保留原始文件

python - Django 中的评论

python - 如何从同一网络上的另一台计算机访问本地主机?

Django 命名 URL 和 HTTPS/SSL

Python/Django 测试运行程序导入错误

python - 从函数访问模块变量是否被认为是不好的做法?

Python Pandas - 读取包含多个表的 csv 文件