python笔记(前后端分离项目涉及知识,restframework(有跨域相关))
一、 serializers一些方法
-
serializers.ModelSerializer(serializerdate.py)
class CourseDetailModelSerializers(serializers.ModelSerializer): course = serializers.CharField(source='course.title') # 对于一对一和一对多跨表查询 courseImg = serializers.CharField(source='course.courseImg') leve = serializers.CharField(source='course.get_leve_display') # 拿取多选字段的中文 chapters = serializers.SerializerMethodField() # 对于manytomany字段 recommend = serializers.SerializerMethodField() # 对于反向查询 class Meta: model = models.CourseDetail fields = ['why_study','slogon','course','slogon','recommend','courseImg','leve','chapters'] # depth = 1 def get_recommend(self,obj):#obj:就是CourseDetail这个对象 queryset = obj.recommend_course.all() return [{"id":item.pk,"title":item.title} for item in queryset] def get_chapters(self,obj): queryset = obj.course.chapters_set.all() return [{"name":item.name,"num":item.num} for item in queryset]
queryset = models.Course.objects.all() ser = serializerdate.CourseModelSerializers(instance=queryset,many=True)
二、 models,ORM一些方法
-
models.Token.objects.update_or_create(user=user,defaults={"token":uid})
对于user用户有token就更新,没有就添加 -
contenttype
组件的作用:可以通过两个字段让表和N张表创建FK关系
表结构:from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class DegreeCourse(models.Model): """学位课程""" name = models.CharField(max_length=128, unique=True) course_img = models.CharField(max_length=255, verbose_name="缩略图") brief = models.TextField(verbose_name="学位课程简介", ) class Course(models.Model): """专题课程""" name = models.CharField(max_length=128, unique=True) course_img = models.CharField(max_length=255) # 不会在数据库生成列,只用于帮助你进行查询 policy_list = GenericRelation("PricePolicy") class PricePolicy(models.Model): """价格与有课程效期表""" content_type = models.ForeignKey(ContentType) # 关联course or degree_course object_id = models.PositiveIntegerField() #不会在数据库生成列,只用于帮助你进行添加和查询 content_object = GenericForeignKey('content_type', 'object_id') valid_period_choices = ( (1, '1天'), (3, '3天'), (7, '1周'), (14, '2周'), (30, '1个月'), (60, '2个月'), (90, '3个月'), (180, '6个月'), (210, '12个月'), (540, '18个月'), (720, '24个月'), ) valid_period = models.SmallIntegerField(choices=valid_period_choices) price = models.FloatField()
使用:
-
在价格策略表中添加一条数据
models.PricePolicy.objects.create( valid_period=7, price=6.6, content_type=ContentType.objects.get(model='course'), object_id=1 ) models.PricePolicy.objects.create( valid_period=14, price=9.9, content_object=models.Course.objects.get(id=1) )
-
根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称
price = models.PricePolicy.objects.get(id=2) print(price.content_object.name) # 自动帮你找到
-
找到某个课程关联的所有价格策略
obj = models.Course.objects.get(id=1) for item in obj.policy_list.all(): print(item.id,item.valid_period,item.price)
-
-
verbose_name
verbose_name 的意思很简单,就是给你的模型类起一个更可读的名字一般定义为中文,我们: verbose_name = "学校" verbose_name_plural 这个选项是指定,模型的复数形式是什么,比如: verbose_name_plural = "学校" 如果不指定Django会自动在模型名称后加一个’s’ help_text admin模式下帮助文档
三、跨域(CORS方法)
class CORSMiddleware(MiddlewareMixin):
def process_response(self,request,response):
# 允许所有域名来获取我的数据
response['Access-Control-Allow-Origin'] = "*"
if request.method == "OPTIONS":
# 允许你携带
response['Access-Control-Allow-Headers'] = "Content-Type"
# 允许你发送DELETE,PUT,POST
response['Access-Control-Allow-Methods'] = "DELETE,PUT,POST"
return response
在setting.py的MIDDLEWARE中添加
'app01.MyMiddleWare.CORSMiddleware'
四、认证组件
class MircAuth(BaseAuthentication):
def authenticate(self,request):
token = request.query_params.get('token')
obj = models.Token.objects.filter(token=token).first()
if not obj:
raise AuthenticationFailed({"code":1001,"error":"认证失败"})
return (obj.user.username,obj)
class Micro(APIView):
authentication_classes = [Auth.MircAuth]
def get(self,request,*args,**kwargs):
# print(request.auth)
# print(request.user)
ret = {"code":1000,"title":"微职位"}
return Response(ret)