四、django-rest-framework—身份验证和权限(Authentication && Permissions)

一、super()知识
python3可以直接用super().xxx调用父类方法
super(子类,self).xx:先找到子类的父类,然后将子类转换成父类,再调用方法

class A:
     def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super().add(x)
b = B()
b.add(2)  # 3

二、windows常识
del:删除文件
rd:用于删除文件夹
rd /s file:删除file文件夹,但是会弹出询问是否删除
rd /q/s file:安静模式,不会询问,直接删除

endpoints:终端

三、数据库
1、主键与外键:主键唯一标识一个表,如果A表中的某个属性在B表中是主键,则该
属性为A表的外键

四、添加主键与外键关系以及序列化
1、

因为在User模型上'snippets'是反向关系,所以在使用ModelSerializer类时默认情况下不会包含它,
因此我们需要为它添加显式字段。

2、
class Manu

class Car
#manu字段作为Manu的外键,Car的主键
manu=models.Foreign(
#如果Manu是app的类则按以下形式调用
‘app.Manu’
related_name=‘car_producted_by_this_manufacturer’
)
manu=Manu()
car=Car()
car.manu:从Car关联到Manu
manu.related_name:从工厂对象反向关联到车的关联名,由manu对象调用

UserSerializer中的反向关联
snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())

捋一捋外键及其序列化的过程:
1、models.py:
#django自带User类,无需定义
#django.contrib.auth.models import User
class User

class Snippet
	#owner是User的外键,Snippet可以通过owner字段正向联系User,User可以通过
	#related_name(snippets)反向联系Snippet
	owner = models.ForeignKey('auth.User', related_name='snippets', on_delet=models.CASCADE)

2、serializers.py:
class UserSerializer(serializers.ModelSerializer):
	#因为在User模型上'snippets'是反向关系,所以在使用ModelSerializer类时默认情况下不会包含它,
	#因此我们需要为它添加显式字段,主键联系的字段
	snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())

	class Meta:
		model = User
		#snippets为models.py中的Snippet类的owner字段的related_name参数
		fields = (....., 'snippets')

3、将用户与代码段相关联
现在,如果我们创建了代码段,则无法将创建代码段的用户与代码段实例相关联。用户不是作为
序列化表示的一部分发送的,而是传入请求的属性。
同构.perform_create()方法覆盖我们的代码段视图上的方法,允许我们修改实例保存的管理方式,
并处理传入请求或请求的URL中隐含的任何信息。
views.py:
SnippetList中添加:
	def perform_create(self, serializer):
		serializer.save(owner=self.request.user)
SnippetSerializer序列化器的create()方法将传递一个额外的"owner"字段,以及来自请求的验证数据。

更新序列化器:
SnippetSerializer中:
owner = serializers.ReadOnlyField(source='owner.username')
确保将owner添加到内部Meta类的fields字段中

3、访问权限
IsAuthenticatedOrReadOnly,这将确保经过身份验证的请求获得读写访问权限,未
经身份验证的请求获得只读访问权限。

from rest_framework import permissions

#SnippetList和SnippetDetail均添加如下代码
#只有经过身份验证的用户才能创建,更新和删除代码段。
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页