ModelSerializer 高级使用

   ModelSerializer中还具有一些高级用法,如批量更新、批量删除、批量创建等。

   但是批量过来的数据格式都需要与前端做好协商,什么样的数据格式是单条操作,什么样的数据格式是批量操作。

   如下,对于单条操作而言,只需要传入编号即可,而批量操作则需要在请求体中传入[]以及被操作的主键编号。

模型表

   书籍表、出版社表、作者表、作者详情表

   作者和作者详情表是一对一关系

   书籍和出版社表是一对多关系

   书籍和作者是多对多关系

   以上关系均是为ORM查询方便所提供,但是在物理表中并没有确切关联

   由于这些表中的数据具有商业价值,所以我们要给它设定一个字段名为delete_status,代表是否逻辑删除(真实并不会删除)。

   初此之外还有create_time代表该记录的创建时间,以及last_update_time代表这张表的最后更新时间。

   所以我们可以给这三张字段抽出一张抽象表,用于被其他表继承:

from django.db import models # Create your models here. class BaseModel(models.Model): delete_status = models.BooleanField(default=False) # 默认不删除 create_time = models.DateTimeField(auto_now_add=True) # 新增记录时自动插入 last_update_time = models.DateTimeField(auto_now=True) # 更新记录时自动插入 class Meta: abstract = True # 抽象类,不会创建真实表,用于继承 class Book(BaseModel): book_id = models.AutoField(primary_key=True) book_name = models.CharField(max_length=32,verbose_name="书籍名称") book_price = models.DecimalField(max_digits=5,decimal_places=2,verbose_name="书籍价格") publish = models.ForeignKey(to="Publish",on_delete=models.DO_NOTHING,db_constraint=False) # 逻辑一对多,实际表没有关联,删除出版社书不受影响 authors = models.ManyToManyField(to="Author",db_constraint=False) # 逻辑多对多,实际表没有任何关联 class Meta: verbose_name_plural = "书籍表" def __str__(self): return self.book_name @property def publish_name(self): # 模拟字段,用于序列化时显示出版社名称 return self.publish.publish_name @property def author_list(self): # 模拟字段,用于序列化时显示多个作者的名字和性别 author_list = self.authors.all() return [ {"author_name":author.author_name,"author_gender":author.get_author_gender_display()} for author in author_list ] class Publish(BaseModel): publish_id = models.AutoField(primary_key=True) publish_name = models.CharField(max_length=32,verbose_name="出版社名称") publish_addr = models.CharField(max_length=32,verbose_name="出版社地址") def __str__(self): return self.publish_name class Author(BaseModel): author_id = models.AutoField(primary_key=True) author_name = models.CharField(max_length=32,verbose_name="作者姓名") author_gender = models.IntegerField(choices=[(1,"男"),(2,"女")]) author_detail = models.OneToOneField(to="AuthorDetail",db_constraint=False,on_delete=models.CASCADE) # 逻辑一对一,实际上没有什么联系 class AuthorDetail(BaseModel): author_phone = models.CharField(max_length=11) # 二、表断关联 # 1、表之间没有外键关联,但是有外键逻辑关联(有充当外键的字段) # 2、断关联后不会影响数据库查询效率,但是会极大提高数据库增删改效率(不影响增删改查操作) # 3、断关联一定要通过逻辑保证表之间数据的安全,不要出现脏数据,代码控制 # 4、断关联 # 5、级联关系 # 作者没了,详情也没:on_delete=models.CASCADE # 出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING # 部门没了,员工没有部门(空不能):null=True, on_delete=models.SET_NULL # 部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT 详解序列器

   进行序列化时,如何区分是创建、更新以及查询单条或多条呢?这其实涉及到ModelSerializer的参数问题。

def __init__(self, instance=None, data=empty, **kwargs):

   如果只传入data参数,代表这是新增一条,则情况如下:

方法\属性\钩子 状态
is_valid()   可用  
initial_data()   可用  
validated_data   仅在调用is_valid()之后可用  
errors   仅在调用is_valid()之后可用  
data   仅在调用is_valid()之后可用  

   如果没有传递data参数,则会发生如下情况:

方法\属性\钩子 状态
is_valid()   不可用  
initial_data()   不可用  
validated_data   不可用  
errors   不可用  
data   可用  

   我们要注意传递参数的情况如下:

   查询单条,只会传入instance

   创建一条,只会传入data

   更新一条,会传入instance以及data

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxdzx.html