Нужна помощь в присвоении значений для выбора в поле Choice в Django
models.py
class Survey_Answer(models.Model):
CHOICES = [('Disagree Strongly', 'Disagree Strongly'),
('Disagree', 'Disagree'),
('Undecided', 'Undecided'),
('Agree', 'Agree'),
('Agree Strongly', 'Agree Strongly')]
question = models.ForeignKey(Survey_Question, on_delete=models.CASCADE)
answer_text = models.CharField(max_length=20, choices=CHOICES, default='Undecided')
date_published = models.DateTimeField('date published', auto_now_add=True)
created_at = models.DateTimeField('created at', auto_now_add=True)
def __str__(self):
return self.answer_text + ' - ' + self.question.question_text
Это мой models.py. Мне нужна помощь в назначении значения для определенной опции в CHOICES (например: 5 баллов за опцию Agree Strongly). Если пользователь выбирает вариант из вариантов, он должен получить баллы, основанные на выбранном варианте
Если вы хотите использовать варианты выбора, вы можете использовать их как кортежи.
CHOICES = (('Disagree Strongly', 'Disagree Strongly'),
('Disagree', 'Disagree'),
('Undecided', 'Undecided'),
('Agree', 'Agree'),
('Agree Strongly', 'Agree Strongly'))
В начале []
используйте ()
.
вы можете переопределить метод сохранения модели.
class Survey_Answer(models.Model):
def save(self,*args, **kwargs):
**Do Stuff whatever you want** //Give points to users
super(Survey_Answer, self).save(*args, **kwargs)
Есть два способа добиться этого. Либо использовать кортеж choices с желаемым значением, либо переопределить метод сохранения модели.
1-Й ВАРИАНТ:
class Survey_Answer(models.Model):
CHOICES = (('Disagree Strongly', '1'),
('Disagree', '2'),
('Undecided', '3'),
('Agree', '4'),
('Agree Strongly', '5'))
question = models.ForeignKey(Survey_Question, on_delete=models.CASCADE)
answer_text = models.CharField(max_length=20, choices=CHOICES, default='Undecided')
date_published = models.DateTimeField('date published', auto_now_add=True)
created_at = models.DateTimeField('created at', auto_now_add=True)
def __str__(self):
return self.answer_text + ' - ' + self.question.question_text
Это просто означает, что пользователь выберет левый вариант (1-й элемент кортежа), а вы можете использовать правый вариант (2-й элемент кортежа) для обработки. Так, если пользователь выберет 'Agree Strongly', у вас также будет значение '5'. Затем вы можете использовать сериализаторы для отображения этого значения. Синтаксис для использования этого будет следующим your_field_display.
файл serializers.py
from rest_framework import serializers
class SurveySerializer(serializers.ModelSerializer):
value = serializers.Charfield(source = 'answer_text_display', read_only = True)
class Meta:
model = Survey_Answer
fields = ('question', 'answer_text', 'date_published', 'value') # assuming that you don't want users to see created at field
обратите внимание, что value является пользовательским полем в сериализаторе.
2-Й ВАРИАНТ:
2-й и предпочтительный вариант - добавить другое поле в модель и переопределить метод save для добавления этого значения
models.py
class Survey_Answer(models.Model):
CHOICES = (('Disagree Strongly', '1'),
('Disagree', '2'),
('Undecided', '3'),
('Agree', '4'),
('Agree Strongly', '5'))
question = models.ForeignKey(Survey_Question, on_delete=models.CASCADE)
answer_text = models.CharField(max_length=20, choices=CHOICES, default='Undecided')
date_published = models.DateTimeField('date published', auto_now_add=True)
created_at = models.DateTimeField('created at', auto_now_add=True)
value = models.IntegerField()
def save(self,*args, **kwargs):
self.value = # add your value based based on if else or above trick used in serializers
super(Survey_Answer, self).save(*args, **kwargs)
def __str__(self):
return self.answer_text + ' - ' + self.question.question_text