2015-09-30 3 views
0

Я делаю интеграцию между Django и AWS Redshift для целей отчетности. До сих пор кажется, что джанго не преуспевает в этом. Одна из проблем, с которыми я столкнулся, заключается в том, что я должен установить альтернативный идентификатор типа для каждой модели, а не тип AutoField, потому что он не поддерживается в redshift. пока что так хорошо, но я думал Если я уже делаю суперкласс для всех моделей, которые я собираюсь использовать, я буду менять имена таблиц на этом пути, мне не нравятся имена по умолчанию, которые django дает для его моделей в db (имя_пользователя__model_name). Мне удалось сделать это для каждой вспомогательной модели (см. Ниже). но я хотел бы объявить его динамически в BaseModel таким образом, чтобы каждая вспомогательная модель получала свое собственное имя таблицы в соответствии с его именем класса.Django model db_table наследование/инъекция

class BaseModel(Model): 
    id = CharField(primary_key=True, max_length=36) 

    class Meta: 
     abstract = True 

    def __init__(self, *args, **kwargs): 
     super(RedshiftBaseModel, self).__init__(*args, **kwargs) 
     self.id = str(uuid4()) 


class SubModel1(BaseModel): 
    class Meta(BaseMode.Meta): 
     db_table = 'SubModel1' 

    field1 = CharField(max_length=64, primary_key=True) 


class SubModel2(BaseModel): 
    class Meta(BaseMode.Meta): 
     db_table = 'SubModel2' 

    field2 = CharField(max_length=64, primary_key=True) 

Возможно ли такое?

ответ

0

Во-первых, вы обязательно не хотите устанавливать self.id в __init__ метод; который будет вызываться каждый раз, когда элемент создается, даже когда он загружается из базы данных, и в этом случае идентификатор db будет переопределен. Намного лучше сделать это значение по умолчанию:

id = CharField(primary_key=True, max_length=36, default=uuid4) 

(хотя также отметить, что Django 1.8 представил UUIDField, так что вы могли бы просто использовать это).

Чтобы ответить на ваш основной вопрос, это возможно, но только через некоторое очень сложное переопределение метакласса модели (не путать с метатемой модели ...). Это почти наверняка будет больше неприятностей, чем того стоит.

+0

Вы правы насчет id, спасибо. Можете ли вы сослаться на любой ресурс относительно переопределения метакласса? – MentalBrake