1234567891011121314151617181920212223242526272829303132333435363738394041 |
- from django.db.models.base import ModelBase
- from psqlextra.types import PostgresPartitioningMethod
- from .base import PostgresModel
- from .options import PostgresPartitionedModelOptions
- class PostgresPartitionedModelMeta(ModelBase):
- """Custom meta class for :see:PostgresPartitionedModel.
- This meta class extracts attributes from the inner
- `PartitioningMeta` class and copies it onto a `_partitioning_meta`
- attribute. This is similar to how Django's `_meta` works.
- """
- default_method = PostgresPartitioningMethod.RANGE
- default_key = []
- def __new__(cls, name, bases, attrs, **kwargs):
- new_class = super().__new__(cls, name, bases, attrs, **kwargs)
- meta_class = attrs.pop("PartitioningMeta", None)
- method = getattr(meta_class, "method", None)
- key = getattr(meta_class, "key", None)
- patitioning_meta = PostgresPartitionedModelOptions(
- method=method or cls.default_method, key=key or cls.default_key
- )
- new_class.add_to_class("_partitioning_meta", patitioning_meta)
- return new_class
- class PostgresPartitionedModel(PostgresModel, metaclass=PostgresPartitionedModelMeta):
- """Base class for taking advantage of PostgreSQL's 11.x native support for
- table partitioning."""
- class Meta:
- abstract = True
- base_manager_name = "objects"
|