我有一个django模型,有两个班级的学生和课程。在获取请求方法中,我希望提取学生信息和他/她正在学习的课程(他们只能参加一门课程)。由于学生可以注册而没有积极的课程,我的返回结果应该只包括学生数据或学生数据以及他/她正在学习的课程名称。
这种代码的天真版本将是:
student = Students.objects.filter(id=student_id)
if student[0].activeCourse:
studentCourse = UniversityCourses.objects.filter(id=student[0].activeCourse)
combined_data = list(chain(student, studentCourse))
output = serializers.serialize('json', combined_data, fields=('name', 'age' 'id', 'courseName'))
else:
output = serializers.serialize('json', user, fields=('name', 'age' 'id'))
return HttpResponse(output, content_type="application/json")
问题1:如果Courses表在调用serialize时还有一个名为name而不是courseName的字段如何区分student.name和studentCourse.name?
问题2:可以在没有冗余代码的情况下完成吗?这意味着我的代码看起来像这样:
student = Students.objects.filter(id=student_id)
output = serializers.serialize('json', user, fields=('name', 'age' 'id'))
if student[0].activeClass:
#add the courseName to the already defined output
return HttpResponse(output, content_type="application/json")
答案 0 :(得分:0)
一个理智的简单解决方案是覆盖get_serialiser_class方法,如:
def get_serializer_class(self):
if self.get_object().activeCourse:
return ActiveProfileSerializer
else:
return ProfileSerializer
ActiveProfileSerializer只为具有活动课程的学生提供了字段,或者您想要提供额外的课程。这些字段应在序列化程序中定义为nested关系:
然后在你的观点上你只需要打电话:
serialiser = self.get_serializer_class()
获取正确的序列化数据。
这种方法的好处在于它为视图返回正确的序列化程序类更加分离。