四、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,)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章