Dites, il y a une page qui a beaucoup de blocs associés. Et chaque bloc nécessite un rendu, une sauvegarde et des données personnalisés.Modèles Django modélisation générique
il est plus simple, du point de vue du code, pour définir les différentes classes (donc, modèles) pour chacun de ces modèles. Simplifié comme suit:
class Page(models.Model):
name = models.CharField(max_length=64)
class Block(models.Model):
page = models.ForeignKey(Page)
class Meta():
abstract = True
class BlockType1(Block):
other_data = models.CharField(max_length=32)
def render(self):
"""Some "stuff" here """
pass
class BlockType2(Block):
other_data2 = models.CharField(max_length=32)
def render(self):
"""Some "other stuff" here """
pass
Mais,
- Même avec ce code, je ne peux pas faire une requête comme
page.block_set.all()
pour obtenir tous les différents blocs, quel que soit le type de bloc. - La raison de ce qui précède est que, chaque modèle définit une table différente; Travailler autour pour l'accomplir en utilisant un modèle de liaison et des clés étrangères génériques, peut résoudre le problème, mais il laisse toujours plusieurs requêtes de tables de base de données par page.
Quelle serait la bonne façon de ce modèle? Les clés étrangères génériques (ou quelque chose d'autre) peuvent-elles être utilisées d'une manière quelconque, pour stocker les données de préférence dans la même table de base de données, tout en réalisant des paradigmes d'héritage.
Mise à jour:
Mon point était Comment puis-je obtenir encore les paradigmes de la POO à travailler. En utilisant une même méthode avec tant de ifs n'est pas ce que je voulais faire. La meilleure solution, me semble-t-il, est de créer une classe python standard séparée (de préférence dans un autre blocks.py), qui définit une sauvegarde qui enregistre les données et leur "type" en instanciant le même modèle. Créez ensuite une balise de modèle et un filtre qui appelle le rendu, la sauvegarde et d'autres méthodes basées sur le type du modèle.
Point à propos du modèle de données de droite, merci. Dans mon cas, pour différents types de blocs, j'ai besoin d'interroger différentes sources de données externes et de les rendre dans un html complètement différent. De plus, cachez les données (au niveau du bloc). Donc, les balises de blocage n'aident pas vraiment. Je pense à des classes simples séparées (pas à des modèles) qui ont une méthode save, qui écrivent dans la même table de base de données. –