标签: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