0

レポートの目的で、Django と AWS Redshift の統合を行っています。これまでのところ、django はうまく機能していないように感じます。私が遭遇した問題の 1 つは、Redshift でサポートされていないため、AutoField タイプではなく、モデルごとに別のタイプ ID を設定する必要があることです。これまでのところとても良いですが、使用するすべてのモデルに対してすでにスーパークラスを実行している場合、途中でテーブル名を変更します.djangoが与えるデフォルトの名前は好きではありません.データベース内のモデルです(app_name__model_name)。すべてのサブモデルでそれを行うことができました(以下を参照)。しかし、各サブモデルがクラス名に従って独自のテーブル名を受け取るように、BaseModel で動的に宣言したいと思います。

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)

そのようなことさえ可能ですか?

4

1 に答える 1

0

まず、メソッドに設定したくないことは確かです。データベースからロードされている場合でも、アイテムがインスタンス化されるたびに呼び出されます。その場合、db ID は上書きされます。デフォルト値にする方がはるかに良いです:self.id__init__

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

(ただし、Django 1.8 で UUIDField が導入されたため、そのまま使用できることにも注意してください)。

ただし、主な質問に答えるには、可能ですが、モデルのメタクラスを非常に複雑にオーバーライドすることによってのみ可能です (モデルのメタクラスと混同しないでください...)。それはほぼ間違いなく、それが価値があるよりも多くの問題になるでしょう.

于 2015-09-30T12:57:52.840 に答える