python笔记(前后端分离项目涉及知识,restframework(有跨域相关))

一、 serializers一些方法

  1. 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]
    

    views.py

    queryset = models.Course.objects.all()
    ser = serializerdate.CourseModelSerializers(instance=queryset,many=True)
    

二、 models,ORM一些方法

  1. models.Token.objects.update_or_create(user=user,defaults={"token":uid})对于user用户有token就更新,没有就添加

  2. 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()
    

    使用:

    1. 在价格策略表中添加一条数据

        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)
        )
      
    2. 根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称

         price = models.PricePolicy.objects.get(id=2)
         print(price.content_object.name) # 自动帮你找到
      
    3. 找到某个课程关联的所有价格策略

         obj = models.Course.objects.get(id=1)
         for item in obj.policy_list.all():
             print(item.id,item.valid_period,item.price)
      
  3. verbose_name

     verbose_name   的意思很简单,就是给你的模型类起一个更可读的名字一般定义为中文,我们:
     verbose_name = "学校"
     
     verbose_name_plural
     这个选项是指定,模型的复数形式是什么,比如:
     verbose_name_plural = "学校"
     如果不指定Django会自动在模型名称后加一个’s’
     help_text    admin模式下帮助文档
    

三、跨域(CORS方法)

MyMiddleWare.py

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'

四、认证组件

Auth.py

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)

views.py

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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值