Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django small ByTestRing在模型上,应该使用什么类型的模型?_Python_Django_Python 3.x_Django Models_Character Encoding - Fatal编程技术网

Python Django small ByTestRing在模型上,应该使用什么类型的模型?

Python Django small ByTestRing在模型上,应该使用什么类型的模型?,python,django,python-3.x,django-models,character-encoding,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) binaryfi

我有一个模型,我想存储一些小的(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
我希望这两个平等检查都是正确的。此外,似乎表明不允许在Binaryfield上过滤queryset(这是我需要能够做到的)。话虽如此,它似乎对我有用:

>>> Foobar.objects.filter(binaryfield__in=[b'\0000', b'blarg'])
<QuerySet [<Foobar: Foobar object>]>
>>Foobar.objects.filter(二进制字段_uuin=[b'\0000',b'blarg'])
我是不是错过了查菲尔德的一些东西?BinaryField在这里是合适的选择吗?还是有更好的选择


如果有必要,我使用的是Django 1.11(目前最新的LTS版本),这是一个运行在Python 3.6上的项目。

BinaryField
是Django 2.1的正确选择。不幸的是,在此之前,文档中包含了一条警告:“无法对
BinaryField
值过滤查询集”。鉴于您能够做到这一点,您可能希望调查并确切了解此处的限制

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

另一种选择是自己显式编码bytefield(比如说,将其编码为十六进制字符),可能是通过创建自定义字段。但是,无论何时
filter()
,您都必须执行相同的操作。丑陋的


因此,尝试使
BinaryField
工作。

没有机会检查它:CharField似乎返回
str
,而BinaryField似乎返回
字节,这与Python3之后的情况不同(请参阅)。因此
read.charfield==b'\0000'.decode()
可能是
true
。我建议使用CharField来处理所提到的BinaryField缺少的功能。