注意:
# 注意:以后所有的資料洗掉,盡量用軟洗掉,使用一個欄位標志是否洗掉,而不是真正的從資料庫中洗掉 -好處:1 這樣洗掉資料不會影響索引,不會導致索引失效 2 之前存的用戶資料還在,以備以后使用
models.py--->資料遷移
# 抽象出一個基表(不再資料庫生成,abstract=True),只用來繼承 class BaseModel(models.Model): is_delete = models.BooleanField(default=False) create_time = models.DateTimeField(auto_now_add=True) class Meta: # 基表必須設定abstract,基表就是給普通Model類繼承使用的,設定了abstract就不會完成資料庫遷移完成建表 abstract = True class Book(BaseModel): name = models.CharField(max_length=16) price = models.DecimalField(max_digits=5, decimal_places=2) publish = models.ForeignKey(to='Publish', db_constraint=False, on_delete=models.DO_NOTHING) # 重點:多對多外鍵實際在關系表中,ORM默認關系表中兩個外鍵都是級聯 # ManyToManyField欄位不提供設定on_delete,如果想設定關系表級聯,只能手動定義關系表 authors = models.ManyToManyField(to='Author', related_name='books', db_constraint=False) @property def publish_name(self): return self.publish.name @property def author_list(self): # ll=[] # for author in self.authors.all(): # ll.append({'name':author.name,'sex':author.get_sex_display()}) return [{'name': author.name, 'sex': author.get_sex_display()} for author in self.authors.all()] class Publish(BaseModel): name = models.CharField(max_length=16) address = models.CharField(max_length=64) class Author(BaseModel): name = models.CharField(max_length=16) sex = models.IntegerField(choices=[(0, '男'), (1, '女')], default=0) class AuthorDetail(BaseModel): mobile = models.CharField(max_length=11) # 有作者可以沒有詳情,洗掉作者,詳情一定會被級聯洗掉 # 外鍵欄位為正向查詢欄位,related_name是反向查詢欄位 author = models.OneToOneField(to='Author', related_name='detail', db_constraint=False, on_delete=models.CASCADE)
admin.py
from django.contrib import admin from app01 import models admin.site.register(models.Book) admin.site.register(models.Publish) admin.site.register(models.Author) admin.site.register(models.AuthorDetail)
創建一個超級用戶,登錄admin后臺管理,造出一些資料(books ,authors,publish)
serializer.py
# 圖書表序列化類 from app01 import models from rest_framework import serializers class ListBookSerializer(serializers.ListSerializer): # def create(self, validated_data): # print('=======',validated_data) # return '1' def update(self, instance, validated_data): print(instance) # book_list:是一堆圖書物件 print(validated_data) # 串列套字典,是要修改的資料 return [self.child.update(book, validated_data[i]) for i, book in enumerate(instance)] class BookSerializer(serializers.ModelSerializer): class Meta: model = models.Book list_serializer_class=ListBookSerializer # 指定many=True的時候,生成的ListBookSerializer的物件了 fields = ['name', 'price', 'publish', 'authors', 'publish_name', 'author_list'] extra_kwargs = { 'publish': {'write_only': True}, 'authors': {'write_only': True}, 'publish_name': {'read_only': True}, 'author_list': {'read_only': True}, } # def create(self, validated_data): # print(validated_data)
utils.py
from rest_framework.response import Response class APIResponse(Response): def __init__(self, code=100, msg='成功', data=https://www.cnblogs.com/guojieying/p/None, status=None, headers=None, content_type=None, **kwargs): dic = {'code': code, 'msg': msg} if data: dic['data'] = data dic.update(kwargs) super().__init__(data=https://www.cnblogs.com/guojieying/p/dic, status=status, headers=headers, content_type=content_type) from rest_framework.views import exception_handler def common_exception(exc, context): # 先呼叫REST framework默認的例外處理方法獲得標準錯誤回應物件 response = exception_handler(exc, context) # 在此處補充自定義的例外處理 if response is None: response = Response(data=https://www.cnblogs.com/guojieying/p/{'code':999,'msg':str(exc)}) return response
settings.py
INSTALLED_APPS = [ ... 'rest_framework' ] REST_FRAMEWORK = { # 配置全域例外 'EXCEPTION_HANDLER': 'app01.utils.common_exception' }
views.py
# book表單增群增 from app01 import serializer from app01 import models from rest_framework.views import APIView from app01.utils import APIResponse class BookView(APIView): def post(self, request, *args, **kwargs): if isinstance(request.data, dict): # 增一條 ser = serializer.BookSerializer(data=https://www.cnblogs.com/guojieying/p/request.data) ser.is_valid(raise_exception=True) ser.save() return APIResponse(data=https://www.cnblogs.com/guojieying/p/ser.data) elif isinstance(request.data, list): # 增多條(讓many=True就可以了) ser = serializer.BookSerializer(data=https://www.cnblogs.com/guojieying/p/request.data, many=True) # 內部如何實作的? # many=True,ser不是BookSerializer物件,而是ListSerializer物件,套了一個個的BookSerializer print(type(ser)) ser.is_valid(raise_exception=True) # from rest_framework.serializers import ListSerializer ser.save() # ListSerializer的save return APIResponse(msg='增加%s條成功' % len(request.data)) def get(self, request, *args, **kwargs): pk = kwargs.get('pk', None) if pk: # 單查 # 方式一 # book=models.Book.objects.filter(id=pk).filter(is_delete=False).first() # if not book: # raise Exception('要查詢的不存在') # 方式二 book = models.Book.objects.get(id=pk, is_delete=False) ser = serializer.BookSerializer(instance=book) else: # 查所有 book_list = models.Book.objects.all().filter(is_delete=False) ser = serializer.BookSerializer(instance=book_list, many=True) return APIResponse(data=https://www.cnblogs.com/guojieying/p/ser.data) def delete(self, request, *args, **kwargs): pk = kwargs.get('pk', None) pks = [] if pk: # 單條洗掉 # res=models.Book.objects.filter(id=pk).update(is_delete=True) # print(res) # return APIResponse(msg='洗掉成功') pks.append(pk) else: pks = request.data res = models.Book.objects.filter(id__in=pks).update(is_delete=True) if res >= 1: return APIResponse(msg='洗掉%s條成功' % res) else: # raise Exception('沒有要洗掉的資料') return APIResponse(code=999, msg='沒有要洗掉的資料') def put(self, request, *args, **kwargs): pk = kwargs.get('pk', None) if pk: # 單條修改 book = models.Book.objects.get(id=pk, is_delete=False) ser = serializer.BookSerializer(instance=book, data=https://www.cnblogs.com/guojieying/p/request.data) ser.is_valid(raise_exception=True) ser.save() return APIResponse(msg='修改成功') else: # 分析:ListSerializer的update方法沒有寫,需要我們自己寫 from rest_framework.serializers import ListSerializer # pks=[item['id'] for item in request.data] # 如果不重寫ListSerializer的update方法,這是存不進去的 pks = [] for item in request.data: pks.append(item['id']) item.pop('id') print(request.data) book_list = models.Book.objects.filter(id__in=pks, is_delete=False) ser = serializer.BookSerializer(instance=book_list, data=https://www.cnblogs.com/guojieying/p/request.data, many=True) print(type(ser)) ser.is_valid(raise_exception=True) ser.save() return APIResponse(msg='修改%s條成功')
urls.py
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ ### book表 path('books/', views.BookView.as_view()), re_path('books/(?P<pk>\d+)', views.BookView.as_view()), ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/226449.html
標籤:架構設計
上一篇:【閱讀筆記】Redis
