2016-06-13 7 views
2

Я пытаюсь создать собственный метод сериализации, который подсчитывает количество пройденных и неудачных викторинов из моей модели QuizResults. Провальная викторина находится под знаком .7, а пройденная викторина - 7 или более.Django Rest Framework Пользовательский метод Serializer

Я хочу, чтобы иметь возможность просматривать QuizResult Users и подсчитывать количество пройденных опросов (.7 или более). Затем я дублировал метод, чтобы подсчитать неудачные викторины (под .7).

До сих пор у меня нет большой идеи о том, как это сделать. Я хочу иметь возможность захватить поле percent_correct модели и выполнить вычисление и добавить его в поле в сериализаторе под названием quiz_passed.

Вот моя QuizResult модель:

class QuizResult(models.Model): 
    quiz = models.ForeignKey(Quiz) 
    user = models.ForeignKey(User, related_name='quiz_parent') 
    percent_correct = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(1.0)]) 
    date = models.DateTimeField(auto_now_add=True) 

    def __str__(self): 
     return 'Quiz Results for : ' + self.quiz.title 

Вот мой сериализатору:

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    todo_count = serializers.IntegerField(source='todo_parent.count', read_only=True) 
    discussion_count = serializers.IntegerField(source='comment_parent.count', read_only=True) 
    quiz_passed = serializers.SerializerMethodField() 

    class Meta: 
     model = User 
     fields = ('todo_count', 'discussion_count', 'quiz_passed', 'username',) 

    def get_quiz_passed(self, obj): 
     return passed 

Любая помощь приветствуется.

Edit:

Я расширил модель пользователя и добавлен метод модели, как вы предложили.

class Profile(User): 

    def get_quizzes_passed_count(self): 
     return self.quiz_parent.filter(percent_correct__gte=0.8).count() 

Затем я добавил ваше предложение в свой профиль. Сериализатор.

К сожалению, когда я добавляю это, в рамке ничего не появляется, как только они были добавлены. Какие-либо предложения? Спасибо.

ответ

3

Вы можете использовать model method на пользовательской модели для подсчета количества этого пользователя из прошедших викторин:

class User(models.model): 
    # rest of your User attributes 
    def get_quizzes_passed_count(self): 
     return self.quiz_parent.filter(percent_correct__gte=0.7).count() 

Затем добавить, что к вашему сериализатору используя ФПИ ReadOnlyField сериализацию этого метода:

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    todo_count = serializers.IntegerField(
     source='todo_parent.count', read_only=True 
    ) 
    discussion_count = serializers.IntegerField(
     source='comment_parent.count', read_only=True 
    ) 
    quiz_passed = serializers.SerializerMethodField() 
    num_quizzes_passed = serializers.ReadOnlyField(source="get_quizzes_passed_count") 

    class Meta: 
     model = User 
     fields = ('todo_count', 'discussion_count', 'quiz_passed', 'username',) 

    def get_quiz_passed(self, obj): 
     return passed 

Вы можете дублировать это для количества пропущенных викторин.

+0

'return self.quiz_parent.filter (percent_correct> 0.7) .count()' должен быть 'return self.quiz_parent.filter (percent_correct__gte = 0.7) .count()' – Fush

+0

Спасибо, обновлено! – YPCrumble

+0

Я применил ваши предложения, но они не сработали. Можете ли вы проверить мое редактирование? Спасибо вам за помощь! – Ryan113

Смежные вопросы