2015-09-30 1 views
0

Je suis en train de faire une intégration entre Django et AWS Redshift à des fins de reporting. Jusqu'à présent, il semble que django ne va pas bien avec. L'un des problèmes que j'ai rencontrés est que je dois définir un identifiant de type alternatif pour chaque modèle, plutôt que le type AutoField car il n'est pas supporté par redshift. jusqu'ici tout va bien, mais je pensais que si je faisais déjà une super classe pour tous les modèles que je vais utiliser, je vais changer les noms des tables sur le chemin, je n'aime pas les noms par défaut que django car ce sont des modèles dans la base de données (app_name__model_name). J'ai réussi à le faire pour chaque sous-modèle (voir ci-dessous). mais je voudrais le déclarer dynamiquement dans BaseModel de manière à ce que chaque sous-modèle reçoive son propre nom de table en fonction de son nom de classe.Django model db_table héritage/injection

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) 

Est-ce possible?

Répondre

0

Tout d'abord, vous certainement ne voulez pas définir self.id dans la méthode __init__; cela sera appelé chaque fois qu'un élément est instancié, même lorsqu'il est chargé depuis la base de données, auquel cas l'ID db sera remplacé. Beaucoup mieux est d'en faire une valeur par défaut:

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

(bien aussi noter que Django 1.8 a introduit une UUIDField, vous pouvez donc l'utiliser).

Pour répondre à votre question principale, cependant, c'est possible - mais seulement à travers un écrasement très complexe de la métaclasse du modèle (à ne pas confondre avec la classe Meta du modèle ...). Ce serait certainement plus de problèmes que cela en vaut la peine.

+0

Vous avez raison à propos de l'identifiant, merci. Pouvez-vous me référer à n'importe quelle ressource concernant le remplacement de la métaclasse? – MentalBrake