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.