自定义model类插拔式字段
#model.py
from django.db import models from drf_demo02 import settings class BaseModel(models.Model): is_delete = models.BooleanField(default=False, verbose_name='是否删除') create_time = models.DateTimeField(auto_now_add=True, blank=True, verbose_name='创建时间') class Meta: abstract = True #db_constraint=False 去除表与表之间的管理关系 #on_delete=models.CASCADE 级联删除 #related_name='books' 反向查询 class Book(BaseModel): name = models.CharField(max_length=32,verbose_name='书名') price = models.DecimalField(max_digits=5,decimal_places=2,verbose_name='价格') author = models.ManyToManyField(to='Author',verbose_name='作者们',db_constraint=False,related_name='books') publish = models.ForeignKey(to='Publish',verbose_name='出版社',on_delete=models.CASCADE,db_constraint=False, related_name='books' ) class Meta: db_table = 'book' verbose_name = '书表' verbose_name_plural = verbose_name def __str__(self): return self.name @property #好处:可以进行插拔式操作 def join(self): return '123' #用于跨表查询,可查询出该对象的出版社名字 @property def publish_name(self): return self.publish.name @property def author_list(self): author_arr = [] for author in self.author.all(): author_arr.append(author.name) return author_arr @property def author_detail_list(self): author_detail_arr = [] for author in self.author.all(): author_dic = {} author_dic['name'] = author.name author_dic['age'] = author.detail.age author_dic['phone'] = author.phone # print(author.icon,type(author.icon)) # print(author.detail.icon) #icon/icon.jpg <class 'django.db.models.fields.files.FieldFile'> #icon是FieldFile类型不能序列化,需要转字符串 author_dic['icon'] = settings.MEDIA_URL + str(author.icon) author_detail_arr.append(author_dic) return author_detail_arr class Publish(BaseModel): name = models.CharField(max_length=32,verbose_name='出版社名') address = models.CharField(max_length=64,verbose_name='地址') phone = models.CharField(max_length=11,verbose_name='电话') class Meta: db_table = 'publish' verbose_name = '出版社表' verbose_name_plural = verbose_name def __str__(self): return self.name class Author(BaseModel): name = models.CharField(max_length=32,verbose_name='作者名') phone = models.CharField(max_length=11,verbose_name='电话') icon = models.FileField(upload_to='icon', default='icon/icon.jpg') class Meta: db_table = 'author' verbose_name = '作者表' verbose_name_plural = verbose_name def __str__(self): return self.name class AuthDetail(BaseModel): age = models.IntegerField(verbose_name='年龄') info = models.TextField(verbose_name='个人信息') CHOICES = ( (0,'女'), (1,'男') ) sex = models.IntegerField(choices=CHOICES,default=0,verbose_name='性别') author = models.OneToOneField(to='Author',verbose_name='作者',related_name='detail', on_delete=models.CASCADE,db_constraint=False,null=True) class Meta: db_table = 'authdetail' verbose_name = '作者详情表' verbose_name_plural = verbose_name def __str__(self): return self.author.name+'的详情表'
序列化类:
from . import models from rest_framework import serializers class BooksModelsSerailizer(serializers.ModelSerializer): #自定义字段 不建议书写在Serializer类中,迁移到model #在ModelSerailizer类中fields字段不能用__all__,必须自定义,且必须包含自定义字段 # join = serializers.SerializerMethodField() # def get_join(self,obj): # return '66666' class Meta: #显示所有字段 # fields = '__all__' #抛除 # exclude = ('id','is_delete','create_time') #深度显示 # depth = 1 #指定字段显示 fields = ('name','price','publish_name','author_list','author_detail_list') model = models.Book class AuthorsModelsSerailizer(serializers.ModelSerializer): class Meta: fields = ('name','phone','icon') model = models.Author
                    
                
                
            
        
浙公网安备 33010602011771号