Py学习  »  Django

Django模型上的小字节数,建模应该使用什么类型?

Adam Parkin • 6 年前 • 1554 次点击  

我有一个模型,我想在其中存储一些小的(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 似乎表明不允许在二进制字段上过滤查询集(这是我需要做的事情)。说了这句话,似乎对我有用:

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

我是不是错过了一些关于查菲尔德的东西?BinaryField是这里的合适选择吗?还是有更好的选择?

如果这很重要,我将使用django 1.11(当前最新的LTS版本),这是一个在Python3.6上运行的项目。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30411
 
1554 次点击  
文章 [ 1 ]  |  最新文章 6 年前
Kevin Christopher Henry
Reply   •   1 楼
Kevin Christopher Henry    6 年前

BinaryField 从Django 2.1开始,这是正确的选择。不幸的是,在文档包含关于“不可能在 二元场 “价值”。考虑到您能够做到这一点,您可能需要调查并确切了解这里的限制是什么。

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

另一种选择是自己显式编码字节字段(比如说,用十六进制字符),可能是通过创建一个自定义字段。但无论何时你都要做同样的事情 filter() . 丑陋的

所以试着做 二元场 工作。