码迷,mamicode.com
首页 > 其他好文 > 详细

Django-rest-framework --- 序列化2

时间:2019-12-26 19:05:54      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:request   ade   war   abstract   相对   ret   需要   影响   总结   

表与表之间的关系

基表

当多个表中有公共的字段的时候,可以将公共的字段定义成基类,通过继承来使表中有基类的字段。

from django.contrib.auth.models import User
class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    create_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 基表:为抽象表,是专门用来被继承,提供共有字段的,自身不会完成数据库迁移
        abstract = True

一对一

一对一在建表的时候外键字段写在任意一方都可以,按照需求建立在合理的地方,比如作者表和作者详情表,作者表查询的比较多,按照正常情况来说使建立在作者表中的,但是,

在正常的数据库表关系中,如果表与表之间存在外键关系,外键在谁那里,谁就不能先进行增删。对多对多关系的表没有影响。

一对多

外键在多的一方

多对多

建立第三章表有多种方式,根据需求来进行建立

外键字段属性

1.related_name在外键中设置外键反向查询的字段名,正向找字段名,反向找related_name值

2.on_delete在外键中必须设置,表示级联设置,在Django1.x下,系统默认提供(值为models.CASCADE),Django2.x下必须手动明确

CASCADE:默认值,级联

例子:作者没了,详情一定没,存在没意义

DO_NOTHING:外键不会被级联,假设A表依赖B表,B记录删除,A表的外键字段不做任何处理

例子:作者没了,书还是作者写的 | 出版社没了,书还是该出版社出版的

SET_DEFAULT:最不常用,假设A表依赖B表,B记录删除,A表的外键字段置default属性设置的值,所以必须配合default属性使用

例子:部门没了,部门员工进入待定部门(注:部门表一定要有待定部门记录)

SET_NULL:假设A表依赖B表,B记录删除,A表的外键字段置为null,所以必须配合null=True属性使用

例子:部门没了,部门员工进图未分组部门(注:关联部门表外键可以为空)

注:多对多字段不能设置on_default级联关系,默认为级联,入股要处理级联关系,需要手动明确关系表,处理关系表中的多个外键(注:改字段只能改ForeignKey)

3.db_constraint在外键中控制表关联,默认为True表示关联,设置False并表示断开关联,增删改查还可以继续操作

序列化

子序列

总结:

1.只能在序列化中使用

2.字段名必须是外键(正反向)字段,因为相对于自定义序列化外键字段,自定义序列化字段使不能参与反序列化的,而子序列化必须为外键名,所以就无法入库

3.在外键关联数据使多条时,需要明确 many=True

4.子序列化时单项操作,因为作为自此列的类必须写在上方,所以不能产生逆方向的子序列化

实例:

"""获取所有出版社的信息"""

# views.py中
class PublishAPIView(APIView):
    def get(self, request, *args, **kwargs):
        publish_query = models.Publish.objects.all()
        publish_ser = serializers.PublishModelSerializer(publish_query, many=True)
        return Response({
            'status': 0,
            'msg': 'ok',
            'results': publish_ser.data
        })
    
# serializer.py中
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Publish
        # fields = '__all__'
        fields = ['name', 'address', 'books']
        
#  urls.py中
url(r'^cars/$', views.CarAPIView.as_view()),

Django-rest-framework --- 序列化2

标签:request   ade   war   abstract   相对   ret   需要   影响   总结   

原文地址:https://www.cnblogs.com/whkzm/p/12103841.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!