Is a many-to-many what you really want?  How common are the choices and suppose 
someone goes in an edits one of the choices and suddenly it doesn't match up 
right with a different linked question.  It might make sense to use a reverse 
foreign key one-to-many relationship and provide a mechanism to duplicate a 
question, including its member choices.  That way you could add some statistics 
on each choice unique to a question.

Several possible paths depending on how you want to go.

1.  You could just use a reverse foreign key and have a one-to-many 
relationship.

class Choice(models.Model):
        question = models.ForeignKey('Question', related_name='choices')
        choice = models.CharField(max_length=255)
        index = models.IntegerField(default=0)  # in case you want order_by 
filtering
        count = models.IntegerField(default=0) # in case you want to count 
number of times this is selected right or wrong
        is_correct = models.BooleanField(default=False) # boolean flag replaces 
"answer"

class Question(models.Model):
      question = models.CharField(max_length=64)
      module = ....
     
        def times_correct(self):
                return 
self.choices.objects.filter(is_correct=True).aggregate(Sum('count'))

        def times_total(self):
                return self.choices.objects.aggregate(Sum('count'))


Then in the admin, you create a table inline admin and just add unique entries.


2. Encode the thing as a JSON list and store in a JSONField
https://github.com/derek-schaefer/django-json-field

3. There are several flavors of ListField out there:
http://djangosnippets.org/snippets/1491/



Brian Schott
[email protected]



On Apr 10, 2013, at 1:38 PM, Cody Scott <[email protected]> wrote:

> I am trying to store questions in a database.
> I don't to set a fixed number of options for the question, some questions 
> could have 4 or 2 or 5.
> 
> Currently I am using a ManyToManyField to a table that just contains a 
> CharField.
> This works but creating an option requires making another Choice object and 
> selecting that, also when you want to select a Choice that has already been 
> created you have to use that little box in the admin and it doesn't scale 
> when you have hundreds of options.
> 
> Even if I wanted to have 4 options every time what is the recommended way 
> without having four CharFields?
> 
> class Choice(models.Model):
>     choice = models.CharField(max_length=255)
>     def __unicode__(self):
>         return self.choice
>  
> #multiple choice question
> class Question(models.Model):
>     question = models.CharField(max_length=64)
>     answer = models.CharField(max_length=255)
>     choices = models.ManyToManyField(Choice, related_name='questions', 
> verbose_name='options')
>     module = models.ForeignKey('Module', related_name='questions')
>  
>     times_correct = models.IntegerField(editable=False, default=0)
>     times_total = models.IntegerField(editable=False, default=0)
>  
>     def _get_average(self):
>         "Returns the average in percent"
>         if self.times_total != 0:
>             return (self.times_correct / float(self.times_total))*100
>         return 0.0
>     average = property(_get_average)
>  
>     def __unicode__(self):
>         return self.question
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/django-users?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>  
>  

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to