Django的Bitfield
django-gravy-bitfield的Python项目详细描述
为django模型提供类似位字段的类(使用bigingerfield)。
(如果要从1.2之前的版本升级,则API已发生重大更改,并且向后不兼容!)
要求
- django>;=1.10
- PostgreSQL(见注释)
注释:
- sqlite不支持使用Bit(根据使用中的示例)进行保存操作。
- mysql在大多数与bitfield相关的查询中失败。
安装
用PIP安装(或简易安装):
pip install django-bitfield
用法
首先,你需要在你的类中附加一个位字段。这相当于数据库中的bigingerfield(bigint):
from bitfield import BitField class MyModel(models.Model): flags = BitField(flags=( 'awesome_flag', 'flaggy_foo', 'baz_bar', ))
标记也可以用标签定义:
class MyModel(models.Model): flags = BitField(flags=( ('awesome_flag', 'Awesome Flag!'), ('flaggy_foo', 'Flaggy Foo'), ('baz_bar', 'Baz (bar)'), ))
现在您可以使用非常熟悉的django操作来使用该字段:
# Create the model o = MyModel.objects.create(flags=0) # Add awesome_flag (does not work in SQLite) MyModel.objects.filter(pk=o.pk).update(flags=F('flags').bitor(MyModel.flags.awesome_flag)) # Set flags manually to [awesome_flag, flaggy_foo] MyModel.objects.filter(pk=o.pk).update(flags=MyModel.flags.awesome_flag | MyModel.flags.flaggy_foo) # Remove awesome_flag (does not work in SQLite) MyModel.objects.filter(pk=o.pk).update(flags=F('flags').bitand(~MyModel.flags.awesome_flag)) # Find by awesome_flag MyModel.objects.filter(flags=MyModel.flags.awesome_flag) # Exclude by awesome_flag MyModel.objects.filter(flags=~MyModel.flags.awesome_flag) # Test awesome_flag if o.flags.awesome_flag: print "Happy times!" # List all flags on the field for f in o.flags: print f # Get a flag label print o.flags.get_label('awesome_flag')
享受吧!
管理
要在管理中使用小部件,需要更新modeladmin。添加 以下行指向您的modeladmin:
formfield_overrides = { BitField: {'widget': BitFieldCheckboxSelectMultiple}, }
通过将这些行添加到文件顶部,确保已导入类:
from bitfield import BitField from bitfield.forms import BitFieldCheckboxSelectMultiple
还有一个BitFieldListFilterlist过滤器(django 1.4或更新版本)。 要使用它,请设置list_filtermodeladmin选项:
list_filter = ( ('flags', BitFieldListFilter,) )
BitFieldListFilter位于^{TT4}$模块中:
from bitfield.admin import BitFieldListFilter