Django Bitfield

2.2.0 · active · verified Fri Apr 17

django-bitfield provides a `BitField` model field for Django, allowing developers to store multiple boolean flags efficiently in a single integer column in the database. It is currently at version 2.2.0, actively maintained, and follows Django's release cadence for compatibility.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to define a `BitField` on a Django model, set and check individual flags, and perform database queries based on flag states. It sets up minimal Django settings for a runnable example.

import os
import django
from django.db import models
from django.conf import settings
from bitfield.models import BitField, BitHandler

# Minimal Django settings for standalone use
if not settings.configured:
    settings.configure(
        DEBUG=True,
        DATABASES={
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': ':memory:',
            }
        },
        INSTALLED_APPS=[
            'django.contrib.contenttypes',
            'django.contrib.auth',
            'bitfield'
        ]
    )
django.setup()

class MyModel(models.Model):
    # Define flags using a tuple of strings
    flags = BitField(flags=(
        'IS_ACTIVE',
        'HAS_FEATURE_A',
        'HAS_FEATURE_B',
        'IS_ARCHIVED'
    ))

    class Meta:
        app_label = 'myapp'

# --- Example Usage ---

# Create a new instance
obj = MyModel.objects.create()
print(f"Initial flags: {obj.flags.as_unique_int()}") # Should be 0

# Set a flag directly (returns True if set, False if already set)
obj.flags.IS_ACTIVE = True
obj.save()
print(f"After setting IS_ACTIVE: {obj.flags.as_unique_int()} (IS_ACTIVE: {obj.flags.IS_ACTIVE})")

# Check a flag
if obj.flags.HAS_FEATURE_A:
    print("Has Feature A")
else:
    print("Does not have Feature A")

# Set multiple flags using BitHandler or integer value
# Using BitHandler: manually set flags
obj.flags = BitHandler(0, flags=('IS_ACTIVE', 'HAS_FEATURE_A', 'HAS_FEATURE_B', 'IS_ARCHIVED'))
obj.flags.IS_ACTIVE = True
obj.flags.HAS_FEATURE_B = True
obj.save()
print(f"After setting IS_ACTIVE and HAS_FEATURE_B: {obj.flags.as_unique_int()}")
print(f"IS_ACTIVE: {obj.flags.IS_ACTIVE}, HAS_FEATURE_A: {obj.flags.HAS_FEATURE_A}, HAS_FEATURE_B: {obj.flags.HAS_FEATURE_B}")

# Querying objects with specific flags
# Get all objects where IS_ACTIVE is True
active_objects = MyModel.objects.filter(flags=MyModel.flags.IS_ACTIVE)
print(f"Active objects count: {active_objects.count()}")

# Get all objects where IS_ACTIVE AND HAS_FEATURE_B are True
active_and_feature_b_objects = MyModel.objects.filter(flags__all=[MyModel.flags.IS_ACTIVE, MyModel.flags.HAS_FEATURE_B])
print(f"Active and Feature B objects count: {active_and_feature_b_objects.count()}")

# Get all objects that have ANY of IS_ACTIVE or HAS_FEATURE_A (OR operation)
active_or_feature_a_objects = MyModel.objects.filter(flags__any=[MyModel.flags.IS_ACTIVE, MyModel.flags.HAS_FEATURE_A])
print(f"Active or Feature A objects count: {active_or_feature_a_objects.count()}")

view raw JSON →