【问题标题】:Django Rest Framework ModelSerializer save errorDjango Rest Framework ModelSerializer 保存错误
【发布时间】:2016-06-09 01:10:20
【问题描述】:

我想从传递给序列化程序的数据中添加一个额外的键值对,但是发生了这个错误:

ValueError: Cannot assign "1": "ExamLog.student" must be a "Students" instance.

序列化器.py

class ExamSubmitSerializer(serializers.ModelSerializer):
    def to_internal_value(self, data):
        x = get_score(data['exam']) # This will result to 1, I have no errors with this one
        data['score'] = x 
        return data

    class Meta:
        model = ExamLog
        fields = ('student', 'score', 'exam_started')

    # Will use this one for auto-email and auto-pdf creation
    # def create(self, validated_data):
    #   # print "-----"
    #   # y = validated_data.pop('exam', None)
    #   # print y
    #   print validated_data
        # x = self.Meta.model(**validated_data)
        # x.save()

views.py

@api_view(['POST'])
def submitExam(request):
    if request.method == 'POST':
        data = request.data
        student = data.get('student', None)
        exam = data.get('exam', None)
        serializer = ExamSubmitSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(standardResponse(data=serializer.data), status=status.HTTP_201_CREATED)
        else:
            return Response(standardResponse(errors=serializer.errors), status=status.HTTP_400_BAD_REQUEST)

urls.py

urlpatterns = [
  # url(r'^view/', views.viewExams),
  url(r'^view/', views.getQuestion),
  url(r'^add/', views.addUpdateQuestion),
  url(r'^submit/', views.submitExam),
  url(r'^', views.filterQuestions),
]

models.py

class Choices(models.Model):
    question = models.ForeignKey(Questions)
    choice = models.TextField()
    correct = models.NullBooleanField()

    def __unicode__(self):
        return self.choice

class ExamLog(models.Model):
    student = models.ForeignKey(Students)
    # answers = models.JSONField? # To be used for data science statistical purposes
    score = models.PositiveIntegerField(null=True, blank=True, default=None)
    exam_started = models.DateTimeField(null=True, blank=True, default=None)
    exam_finished = models.DateTimeField(auto_now_add=True)

get_score 方法:

def get_score(answers):
    x  = Choices.objects.filter(id__in=answers).filter(correct=1)
    return x.count()

对 API 的示例请求:

{"student":1, "exam":[ 1597, 1620, 1906, 1648, 1656, 1718, 1611, 1551, 1812, 1745, 1489, 1815, 1527, 1485, 1512, 1831, 1545, 1713, 1808, 1530 ]}

我明白错误的含义。应该传递模型的实例而不是其 id,但是当我不包含 to_internal_value() 方法时,不会发生此错误并且实际上会保存。但是,这将导致 分数为空

我想在分数上添加一个值,该值将来自数据的 exam

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:
    def to_internal_value(self, data):
        x = get_score(data['exam']) # This will result to 1, I have no errors with this one
        data['score'] = x
    
        data = super(ExamSubmitSerializer, self).to_internal_value(data)
    
        return data
    

    在返回数据之前在方法上调用 super 将允许再次清理数据以及操纵的分数数据键值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 2021-08-08
      • 2014-09-21
      • 2021-02-06
      • 1970-01-01
      • 2016-02-23
      • 2022-10-02
      • 2020-06-27
      相关资源
      最近更新 更多