2010-07-01 9 views
1

Comment modéliser ce dans django:Comment modéliser ce dans django (modèle hérité, dans lequel chaque modèle hérité a une méthode unique)

1) présentent un réseau de base de fabricants

2) en dessous de chaque réseau leur est peut-être plusieurs distributeurs

3) un utilisateur du système peut accéder aux éléments par le distributeur

4) si un accès utilisateur l'élément par le distributeur, nous voulons que l'article à traduire où chaque fabricant aura leur propre traduction

class Manufacturer(models.Model): 
    networkname = models.CharField(max_length=128) 

    class Meta: 
     proxy = True 

class Distributor(models.Model): 
    man = models.ForeignKey(Manufacturer) 

class ManuType1(Manufacturer): 
    def translate(self, str): 
     return 'translate' 

class ManuType2(Manufacturer): 
    def translate(self, str): 
     return 'translate' 

Dans ce scénario, nous obtiendrons une demande pour un certain distributeur. Nous identifions ce distributeur et nous voulons appeler les fabricants de distributeurs à traduire la méthode. Cela ressemble-t-il à un moyen de modéliser ceci dans django (je suis sûr qu'il y a plusieurs façons de le faire) donc toute entrée/commentaire est utile.

Où je rencontre des problèmes (ne connaissant pas assez bien Python peut-être) est donné un distributeur avec ManuType1 Comment puis-je appeler la fonction de traduction à l'exécution?

Ceci est probablement un modèle bien exploré en utilisant d'autres termes, mais je ne sais pas exactement comment l'exprimer exactement.

+0

Que voulez-vous atteindre à la fin? Voulez-vous i18n pour les données dans vos objets de fabricant? Il y a d'autres options qui pourraient être plus faciles par rapport à ce que vous essayez de faire. – stefanw

+0

réellement la méthode de traduction est vraiment hors de propos ... il pourrait être n'importe quelle méthode qui sera utilisée dans chaque variation du fabricant ... – jmat

Répondre

0

Si dist est une instance de Distributeur, alors vous pouvez faire dist.man pour obtenir l'instance Fabricant. En raison de la façon dont l'héritage multi-tables fonctionne dans Django, vous devez accéder à OneToOneField qui existe sur le fabricant à l'instance de sous-classe. Le problème réside dans la détermination de l'instance de sous-classe existante. Cela peut être rendu plus facile par storing the ContentType of the subclass in the Manufacturer instance.

+0

Merci pour votre réponse, suivant cette méthode semble ce que je cherche fondamentalement, mais qu'en est-il si je veux être en mesure d'ajouter un ManuType spécifique dans l'admin sans que mon administrateur soit encombré avec tous les différents fabricants possibles? En d'autres termes, j'aimerais que mon administrateur ait la possibilité de créer un nouveau fabricant et de sélectionner l'instance spécifique (ManuType1, ManuType2 ...) lorsqu'il essaye de créer ce type de fabricant. Puis, lorsqu'un utilisateur crée un nouveau distributeur, il peut choisir parmi tous les différents fabricants pour associer le distributeur à .....? – jmat

+0

Cela peut être possible avec un ModelAdmin personnalisé et peut-être une instance Form personnalisée qui effectue tout le travail de fournir le formulaire approprié et ensuite créer l'instance appropriée en conséquence, au lieu de simplement une instance constructeur simple. Malheureusement, Django ne supporte pas actuellement le moyen d'ajouter une instance de sous-classe à une instance de superclasse après que l'instance de superclasse existe déjà; vous devez créer l'instance de la sous-classe en premier lieu. Et, malheureusement, l'administrateur de Django ne joue pas aussi bien avec l'héritage multi-tables qu'avec tout le reste. –

+0

Merci encore pour vous des réponses rapides ... Une idée de comment vous pourriez sélectionner les instances à afficher? Cette partie m'a un peu confus, j'ai vu des exemples des instances Form/Admin personnalisées autour ... – jmat

Questions connexes