Можно ли дать Django команду сохранить экземпляр модели в определенной таблице на основе ее полей? - PullRequest
1 голос
/ 11 октября 2010

Я пытаюсь создать приложение Django, которое моделирует существующий набор таблиц. Все эти таблицы имеют одинаковые поля, а также настраиваемые поля для каждой таблицы. То, что я хочу сделать, это смоделировать эту структуру и сохранить записи в конкретной таблице в зависимости от того, к какой модели таблицы они прикреплены.

Эти таблицы можно создавать довольно часто, поэтому невозможно создавать новые модели для каждой таблицы.

Возможно, код продемонстрирует, что я пытаюсь сделать более четко:



class CustomField(models.Model):
    column_name = models.CharField(max_length=100)
    description = models.CharField(max_length=255, blank=True, null=True)

class CustomData(models.Model):
    custom_field = models.ForeignKey(CustomField)
    value = models.CharField(max_length=100, blank=True, null=True)
    # value will always be a nullable varchar(100)

class Table(models.Model):
    table_name = models.CharField(max_length=255)
    name = models.CharField(max_length=100)
    custom_fields = models.ManyToManyField(CustomField)

class Record(models.Model):
    table = models.ForeignKey(Table)
    ... list of common fields omitted ...
    custom_values = models.ManyToManyField(CustomData)

При сохранении новой записи, имеющей внешний ключ, в 'table_1', я бы хотел, чтобы конечная операция выполнялась в формате insert into table_1 (..fields..) values (..field values..)

Возможно ли это? Думаю, я мог бы подключиться к сигналам или к методу сохранения, но я бы хотел найти самый простой подход, если таковой существует.

1 Ответ

1 голос
/ 11 октября 2010

Вы можете создавать неуправляемые модели динамически.Вам просто нужно создать имена столбцов в зависимости от значений данных.Получив это, вы можете сделать следующее:

from django.db import models

# This is the dict you created, mapping column names to values
values = {col_1: value_1, col_2: value_2, col_3: value_3, ... }

# Create a dict defining the custom field types, eg {col_name: django_field}
attrs = dict((c, models.CharField(max_length=100, blank=True, null=True)) for c in values)

# Add a Meta class to define the table name, eg table_1
class Meta:
  app_label = myapp
  db_table = 'table_1'
  managed = False
attrs['Meta'] = Meta
attrs['__module__'] = 'path.to.your.apps.module'

DynamicModel = type('MyModel', (models.Model,), attrs)

# Save your data
DynamicModel.objects.create(**values)

Оберните это в функцию и поместите в свой метод .save() на Record.Если у вас есть общие поля, вы можете добавить их к attrs, или даже лучше: создайте абстрактную модель со всеми общими полями и наследуйте ее в последней строке выше вместо models.Model.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...