2008-11-22 7 views
2

Voici ce que je suis en train de faire, et de ne pas ...Inlines génériques Admin pour les modèles de sous-classes multi-tables cassé --- des alternatives?

J'ai un modèle de fichier qui a une relation générique à d'autres objets:

class File(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 
    file = models.FileField(upload_to='files/%Y/%m/%d') 
    # etc.... 

Je veux aussi avoir un sous- classe de fichier pour traiter le cas particulier des images à afficher en page, plutôt que téléchargé:

class Image(File): 
    file = models.ImageField(upload_to='files/%Y/%m/%d') 

Tous les travaux ci-dessus très bien, y compris inline génériques du modèle de fichier, jusqu'à ce que je veux utiliser un générique-inline du modèle Image --- le proc de sauvegarde ess ne parvient pas à créer l'instance de la classe de base et déclenche donc une erreur indiquant que Image.file_ptr (la clé étrangère 'secret' de la classe de base) ne peut pas être None. Par conséquent, les encarts génériques ne prennent pas en charge correctement l'héritage multi-tables pour le moment.

Il est très probable que je rends cela plus compliqué que nécessaire, donc quelqu'un peut-il suggérer soit une solution à ce problème, soit une meilleure façon d'atteindre le même objectif?

S'il vous plaît laissez-moi savoir si vous avez besoin de plus amples explications.

Répondre

0

L'héritage peut être implémenté de deux manières dans un modèle relationnel.

Une sous-classe peut être une nouvelle table avec toutes les mêmes colonnes que la superclasse répétée. Cela fonctionne bien lorsque vous avez une superclasse abstraite ou des fonctionnalités de sous-classe qui remplacent la superclasse.

Une sous-classe peut être simplement les colonnes uniques avec une jointure à la table de superclasse. Cela fonctionne bien quand vous avez une superclasse concrète.

Dans votre cas, il se peut que vous ayez les éléments suivants.

class FileFacts(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

class DownloadFile(models.Model): 
    facts = models.ForeignKey(FileFacts) 
    file = models.FileField(upload_to='files/%Y/%m/%d') 

class InlineImage(models.Model): 
    facts = models.ForeignKey(FileFacts) 
    file = models.ImageField(upload_to='files/%Y/%m/%d') 

Ceci est ma préférence pour la gestion d'un modèle de type sous-classe.

Questions connexes