2010-06-23 2 views
1

Ok, je suis merde à décrire. Voici une relation diag. relationship diag http://img248.imageshack.us/img248/3568/surveyrel.jpgDjango Modèle/Design de base de données pour les sous-classes

Dans Django j'ai fait mes modèles:

from django.db import models 
from datetime import datetime 

class Survey(models.Model): 
    name = models.CharField(max_length=100) 
    pub_date = models.DateTimeField('date published',default=datetime.now) 
    def __unicode__(self): 
     return self.name 

# This model should be abstracted by a more specific model 
class Section(models.Model): 
    survey = models.ForeignKey(Survey) 
    name = models.CharField(max_length=100) 
    def __unicode__(self): 
     return self.name 

# Models for supporting the 'ratings' mode 
class RatingSection(Section): 
    pass 

class RatingQuestion(models.Model): 
    section = models.ForeignKey(RatingSection) 
    name = models.CharField(max_length=255) 
    def __unicode__(self): 
     return self.name 

class RatingAnswer(models.Model): 
    section = models.ForeignKey(RatingSection) 
    name = models.CharField(max_length=60) 
    def __unicode__(self): 
     return self.name 

class RatingVotes(models.Model): 
    question = models.ForeignKey(RatingQuestion) 
    answer = models.ForeignKey(RatingAnswer) 
    votes = models.PositiveIntegerField(default=0) 
    def __unicode__(self): 
     return self.votes + self.answer.name + ' votes for ' + self.question.name 

# Models for supporting the 'multichoice' mode 
class MultiChoiceSection(Section): 
    can_select_multiple = models.BooleanField() 

class MultiChoiceQuestion(models.Model): 
    section = models.ForeignKey(MultiChoiceSection) 
    name = models.CharField(max_length=255) 
    def __unicode__(self): 
     return self.name 

class MultiChoiceAnswer(models.Model): 
    section = models.ForeignKey(MultiChoiceSection) 
    name = models.CharField(max_length=60) 
    votes = models.PositiveIntegerField(default=0) 
    def __unicode__(self): 
     return self.name 

Le problème est que je suis presque certain que n'est pas la bonne façon de le faire, et même si elle est, je peux » t expliquer comment permettre à la zone d'administration de Django d'afficher une sélection à l'utilisateur demandant quel sous-type de section il souhaite.

Quelle serait la meilleure façon de structurer des modèles de ce genre?

+0

Peut-être que vous pouvez décrire un peu plus en détail ce que vous avez besoin de vos « sections » pour? –

+0

Idéalement, j'aimerais que chaque enquête comporte plusieurs sections de différents types (par exemple, choix multiple ou notation), et je voulais que chaque type différent soit une sous-classe de la classe générique, Section. Cependant, je ne suis pas sûr si c'est le meilleur modèle de base de données - je suis assez sûr que ce n'est pas le cas. –

Répondre

0

Vous pouvez également avoir une classe de section ayant un attribut type qui peut être noté ou multiplechoice - ce qui sera rendu dans la boîte de dialogue admin puis select.
Mais je pense que vous devriez jeter un oeil à la possibilité de Django pour créer des modèles abstraits: http://docs.djangoproject.com/en/dev/topics/db/models/#id6

class Section(models.Model): 
    survey = models.ForeignKey(Survey) 
    name = models.CharField(max_length=100) 

    class Meta: 
     abstract = True  # no db table created for this model 

    def __unicode__(self): 
     return self.name 


class RatingSection(Section): 
    pass 

class MultiChoiceSection(Section): 
    can_select_multiple = models.BooleanField() 
+0

comment exactement j'implémenterais cet attribut "type". Idéalement, je voudrais simplement lister toutes les sous-classes de Section afin que je ne doive pas changer de type manuellement. –

+0

Eh bien, si vous prenez ma solution ci-dessus, vous avez juste besoin d'enregistrer une classe ModelAdmin for evey Section, puis vous aurez une section séparée dans l'admin pour éditer les instances de cette classe! Ou deuxième solution: Vous avez une classe avec un attribut 'choices' qui peut être soit" rating "ou" multichoice ", voir http://www.djangoproject.com/documentation/models/choices/ sur comment implémenter des choix de champs ! –

Questions connexes