Несколько таблиц для одной модели Django
Как я могу динамически создать несколько таблиц для одной конкретной модели?
У меня есть модель (например, "Данные") и я хочу, чтобы каждый пользователь получал отдельную таблицу базы данных для этой модели.
Будет от 30 до 40 пользователей, каждый из которых имеет около 20 миллионов записей в "Data". Чтобы таблица базы данных не набрала 800 миллионов строк, я хотел бы разделить ее.
Конечно, также возможно, что в будущем их будет больше
Возможно ли это с помощью Django ORM?
Я работаю на PostgreSQL
Спасибо :)
Для выполнения строгого требования мне пришлось пройти через это. Я просто оставлю свое решение здесь для дальнейшего использования. После создания User, допустим, мы хотим создать таблицу "user_data_100" с моделью "UserData" в базе данных pgsql. Примечание: здесь "100" - это значение первичного ключа модели "User" (записи таблицы).
в app/model.py создайте модель пользователя.
from django.db import models
from django.db.models.signals import pre_save, post_save
from django.dispatch import receiver
from django.db import connection
from django.contrib.auth.models import User
class UserData(models.Model):
class Meta:
pass
dt_column_one = models.CharField(max_length=10,)
dt_column_two = models.CharField(max_length=5,)
def create_model_by_prototype(model_name, schema_name, tbl_name, prototype):
import copy
class Meta:
pass
setattr(Meta, "db_table", schema_name + "\".\"" + table_name)
fields = {}
for field in prototype._meta.fields:
fields[field.name] = copy.deepcopy(field)
attrs = {'__module__': "app.models.models", 'Meta': Meta}
attrs.update(fields)
model = type(model_name, (models.Model,), attrs)
return model
Примечание: функция "create_model_by_prototype" сгенерирует модель с заданным именем таблицы.
Теперь давайте воспользуемся функцией. Я предполагаю, что пользователь будет создан из админки сайта. Давайте создадим функцию post_save для создания таблицы UserData.
@receiver(post_save, sender=User)
def create_user_data_table(sender, instance, *args, **kwargs):
print('User post save')
if kwargs['created']:
user_id = instance.id
dy_table_name = "user_data_" + str(user_id)
model= create_model_by_prototype("MyUserData", "public", dy_table_name, UserData)
with connection.schema_editor() as schema_editor: schema_editor.create_model(model)
else:
print('updated')
надеюсь, это вам поможет. Спасибо.