Несколько таблиц для одной модели 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')

надеюсь, это вам поможет. Спасибо.

Вернуться на верх