乐趣区

关于django:Django中的View操作

导入:from django.views import View

一、查问所有数据

  • 查问数据在自定义的视图类中定义 get 办法
  • 应用 django.http 模块中的 JsonResponse 对非 json 格局的数据做返回解决
  • 在 JsonResponse 必须增加 safe=False 参数,否则会报错:In order to allow non-dict objects to be serialized set the safe parameter to False.
from django.http import HttpResponse 
from django import http  
# Create your views here. 
class UserView(View):  
    '''用户视图'''   
    def get(self, request): 
        # 模型类实例化对象 
        users = UserProfile.objects.all() 
        user_list = [] 
        for user in users: 
            user_dict = { 
                'id': user.id, 
                'username': user.username, 
                'password': user.password, 
                'open_id': user.open_id, 
                'code': user.code 
            } 
        user_list.append(user_dict)
     return http.JsonResponse(user_list) 

二、创立数据

  • 应用 django 中的 json,把前端传递过去的 json 数据转成字典
  • 应用 django.db.models 模块中的 Q 来查问多个字段在数据库中是否存在
from django.views import View 
from django.http import HttpResponse 
from django import http 
from django.db.models import Q 
import json  
class UserView(View):  
    '''用户视图''' 
    def post(self, request): 
        # 获取数据, json 转字典 
        dict_data = json.loads(request.body.decode()) 
        print(dict_data) 
        nick_name = dict_data.get('nickName') 
        code = dict_data.get('code') 
        open_id = "xljsafwjeilnvaiwogjirgnlg" 
        # 校验数据 
        result = UserProfile.objects.filter(Q(code=code) | Q(open_id=open_id)) 
        if not result.exists(): 
            # 数据入库 
            user = UserProfile.objects.create(username=nick_name, open_id=open_id, code=code) 
            # 返回响应 
            user_dict = { 
                'id': user.id, 
                'username': user.username, 
                'password': user.password, 
                'open_id': user.open_id, 
                'code': user.code 
            } 
            return http.JsonResponse(user_dict) 
        return http.JsonResponse("用户已存在", safe=False, status=202)

三、查问某一条数据 (单个)

  • 前端须要传递 pk/id 值,通过 pk/id 查问数据,查问一条数据必须用 get,不能用 filter,否则会报错:AttributeError: ‘QuerySet’ object has no attribute ‘id’
  • 数据转换
  • 返回响应
class UserProfileDetail(View):  
    '''详情视图'''   
    def get(self, request): 
        userInfo = UserProfile.objects.get(id=id) 
        if not userInfo: 
            return HttpResponse("查问的用 Info 户不存在", status=404)                 
        user_dict = { 
            'id': userInfo.id, 
            'username': userInfo.username, 
            'password': userInfo.password, 
            'open_id': userInfo.open_id, 
            'code': userInfo.code 
        } 
        return http.JsonResponse(user_dict, status=200) 

四、更新一条数据

  • 前端须要传递 pk/id 值,通过 pk/id 查问数据,查问一条数据必须用 get,不能用 filter,否则会报错:AttributeError: ‘QuerySet’ object has no attribute ‘id’
  • 更新一条数据时必须应用 filter 来查问数据集,再应用 update(**data) 来更新数据,不能应用 get,否则会报错:AttributeError: ‘ 模型类 ’ object has no attribute ‘update’

get 查问获取到的是数据对象,而 filter 查问获取到的是数据集

class UserProfileDetail(View):  
    '''详情视图'''   
    def put(self, request, id): 
        data_dict = json.loads(request.body.decode()) 
        userInfo = UserProfile.objects.get(id=id) 
        if not userInfo: 
            return HttpResponse("查问的用 Info 户不存在", status=404)                 
        UserProfile.objects.filter(id=id).update(**data_dict) 
        userInfo = UserProfile.objects.get(id=id) 
        user_dict = { 
            'id': userInfo.id, 
            'username': userInfo.username, 
            'password': userInfo.password, 
            'open_id': userInfo.open_id, 
            'code': userInfo.code 
        } 
        return http.JsonResponse(user_dict, status=200)

五、删除某一条数据

class UserProfileDetail(View):  
    '''详情视图'''   
    def delete(self, request, id): 
        userInfo = UserProfile.objects.filter(id=id) 
        if not userInfo: 
            return HttpResponse("删除的数据不存在", status=404)                     
        UserProfile.objects.filter(id=id).delete() 
        return HttpResponse("数据删除胜利", status=204)

上述的操作只能实用于数据表中字段很少的状况,如果字段较多,写起来会很麻烦,不利于开发

退出移动版