自定义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

 

posted on 2019-09-19 20:47  Jolinhe  阅读(257)  评论(0)    收藏  举报