django可以使用restframework快速开发接口,返回前端所需要的json数据,但是有时候利用restframework开发的接口并不能满足所有的需求,这时候就需要自己手动开发接口,也就是将需要用到的某些对象转化为需要使用的json数据,今天记录一下django自己定义接口的一种方法与思路
假设我们定义三张数据表,分别是问卷,问题,选项。一张问卷包含不同的问题,一个问题可以设置不同的选项,自定义的接口可以实现查看所有或单个问卷的标题与id,可以查看所有或单个问题的所属问卷,问题标题,问卷的选项。
1.定义我们需要的模型类,并且在对应的模型类中定义对应的将对象转化为字典的函数
from django.db import models class Questionnaire(models.Model): '''问卷''' title = models.CharField('标题',max_length=100) class Meta: verbose_name_plural = '所有问卷' def questionnaire_to_dict(self): '''把questionnaire对象转化为字典''' return dict(questionnaire_id=self.id,title=self.title,questions=[question.question_to_dict() for question in self.questions.all()]) def __str__(self): return self.title class Question(models.Model): '''问题''' #所属问卷 questionnaire = models.ForeignKey(Questionnaire,verbose_name='所属问卷',related_name='questions') #问题标题 title = models.CharField('问题',max_length=150) #是否是多选 is_checkbox = models.BooleanField('是否多选',default=False,help_text='是否是多选问题') class Meta: verbose_name_plural = '问题' def question_to_dict(self): '''把question对象转化为字典''' return dict(title=self.title,choice=[choice.choice_to_dict() for choice in self.choices.all()], is_checkbox=self.is_checkbox,questionnaire_id=self.questionnaire.id) def __str__(self): return self.title class Choice(models.Model): '''选项''' #所属的问题 question = models.ForeignKey(Question,verbose<span style="color:transparent">来1源gaodai#ma#com搞*代#码1网</span>_name='所属问题',related_name='choices') content = models.CharField('选项内容',max_length=150) class Meta: verbose_name_plural = '问题选项' def choice_to_dict(self): '''把choice对象转化为字典''' #选项id,选项所属的问题id,选项内容 return dict(id=self.id,question_id=self.question.id,content=self.content) def __str__(self): return self.content
将你需要转化为字典的字段添加进函数中,当指定外键时,”related_name”为指定关系名,用于反向查找,比如通过问卷查找问题,但是问卷模型类中没有question字段,但是question类中指定questionnaire外键时指定了关系名related_name=’questions’所以可以通过self.questions.all()来查看当前问卷的所有问题。
2.定义类视图
(1)定义查看所有问卷与添加问卷的类视图
from question.models import Question,Questionnaire,Choice from django.http import JsonResponse from django.views import View import json class Questionnaires(View): def get(self,request): #获取所有问卷 data = [] questionnaires = Questionnaire.objects.all() #获取所有的问卷类 for questionnaire in questionnaires: data.append(questionnaire.questionnaire_to_dict()) return JsonResponse({'data':data}) def post(self,request,*args,**kwargs): data = json.loads(request.body.decode()) questionnaire = Questionnaire(title=data.get('title')) questionnaire.save() return JsonResponse({'msg':'success save'}) class QuestionnaireDetail(View): '''获取id为questionnaire_id的问卷''' def get(self,request,questionnaire_id): questionnaire = Questionnaire.objects.get(id=questionnaire_id) data = questionnaire.questionnaire_to_dict() return JsonResponse(data)
这里继承View类自己定义get方法与post方法处理请求,首先获取到所有的问卷对象,在将每一个问卷对象通过自定义的函数转化为字典,最后返回json数据,同样处理post请求添加问卷时,首先获取到问卷的标题,然后实例化一个问卷的对象,再将问卷对象保存。获取单个问卷对象通过传递的id查看到指定的问卷对象,再通过自定义的函数将对象转化为字典数据,最后返回单个问卷对象的json数据。