Джанго взвешенная анкета? - PullRequest
2 голосов
/ 29 августа 2010

Я учу джанго время от времени уже несколько лет и считаю себя продвинутым новичком, ха.Я работаю над «взвешенным вопросником» (это лучшее имя, которое я могу дать в любом случае) для клиента и ходил кругами о том, где его использовать.

Клиент придумал сериюиз вопросов да или нет и в зависимости от ответа будут применяться определенные весовые коэффициенты.В конце после подачи мне нужно проверить ответы и сложить весовые коэффициенты, а затем показать отчет с предлагаемыми продуктами на основе весовых коэффициентов.Весовые коэффициенты - это просто продукты с определенными числовыми значениями для каждого вопроса.

Например:

«Вы курите?»

Если ответили «да»,затем примените следующее: Core (1), Alpha (4), Liver (2), Jade (1), Rejuve (4)

Я установил начальные модели и администратора, но я вродеозадачен тем, как писать мнения.Они смогут добавлять вопросы с желаемыми ответами, а затем столько весов (которые имеют внешний ключ к продуктам) и значений для каждого вопроса, сколько они хотят.

Вот мои модели:

from django.db import models
from src.products.models import Product

"""
    This app has 'yes' or 'no' questions.  Each question has several 'weightings'
    atached to it which are tallied at the end to recommend specific products
    to the user doing the questionairre.
"""

class Question(models.Model):

    """Yes or no questions to gether enough info to recommend products via the weightings."""

    ANSWER_CHOICES = (
        ('y', 'Yes'),
        ('n', 'No'),
    )

    GENDER_CHOICES = (
        ('a', 'All'),
        ('m', 'Male'),
        ('f', 'Female'),
    )

    question_text = models.CharField(
        help_text="The text to be displayed for the question",
        max_length=300
    )
    answer = models.CharField(
        help_text="Weightings will be applied based on the answer. <br> Ex: If 'Yes' is chosen for 'Do you smoke?', then weightings will be applied if the user answers 'Yes'",
        max_length=1,
        choices=ANSWER_CHOICES
    )
    applies_to = models.CharField(
        help_text="Used to filter questions based on gender of user answering the questions.",
        max_length=1,
        choices=GENDER_CHOICES
    )
    order = models.IntegerField(
        help_text="Used to determine the ordering of the questions.  If left blank, the question will appear after those which are ordered.",
        blank=True,
         null=True,
    )

    class Meta:
        verbose_name_plural = 'questions'
        ordering = ['order']

    def __unicode__(self):
        return self.question_text


class Weighting(models.Model):

    """References products with a specified weighting.
        Added up at end to recommend products."""

    question = models.ForeignKey(Question)
    product = models.ForeignKey(Product)
    value = models.IntegerField()

    def __unicode__(self):
        return '%s %s %s' % (self.question, self.product, self.value)

Я вручную создаю формы прямо сейчас.Я считаю, что это лучший способ.

Итак, каков будет лучший способ получить ответы по почте, затем сравните ответ с желаемым ответом и получите сумму весов по всемвопросы?

Последняя часть с суммой кажется наиболее сложной.

Мысли и предложения?

РЕДАКТИРОВАТЬ: Использование для справки:

http://questionnaire.corporatism.org/

1 Ответ

2 голосов
/ 29 августа 2010

То, что вы пытаетесь сделать, это в основном установить отношение «многие ко многим» между Question и Product и взвесить это отношение, добавив поле к отношению (значение); есть некоторая документация о том, как это сделать с помощью Django! Я думаю, вам понадобится еще одна модель для хранения ответов, которые дал пользователь, это может быть что-то вроде этого:

from django.contrib.auth.models import User

class Answer(models.Model):
    user = models.ForeignKey(User)
    question = models.ForeignKey(Question)
    answer = models.CharField(choices=ANSWER_CHOICES, max_length=1)

После того, как вы сохранили ответы, я думаю, что единственным способом будет перебирать ответы одного пользователя, отвечать по ответам и суммировать значения, если вопросы имеют правильный ответ!

РЕДАКТИРОВАТЬ: Это решение сохраняет постоянный ответ пользователя в базе данных, вы должны думать сами, что вы хотите с ними делать, в противном случае вы можете просто сохранить их для сеанса, например. в словаре в request.session.

РЕДАКТИРОВАТЬ: чтобы получить вопросы в одной форме, попробуйте что-то вроде:

class QuestionForm(forms.Form):

    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
             initial=None, error_class=ErrorList, label_suffix=':',
             empty_permitted=False):
        super(QuestionForm, self).__init__(data, files, auto_id, prefix,
             initial, error_class, label_suffix, empty_permitted)
        self.questions = Question.objects.all()
        if self.questions:
            for question in self.question:
                self.fields['question_%s' % question.pk] =\
                    forms.ChoiceField(label=question.question_text,
                        choices=[(q.pk, q.answer) for q in question.answer_set.all()])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...