社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Adam Parkin • 6 年前 • 1558 次点击  

我有一个模型,我想在其中存储一些小的(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
 
1558 次点击  
文章 [ 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() . 丑陋的

所以试着做 二元场 工作。