1. 程式人生 > >Django rest framework 常用外來鍵命令 (加入、刪除、檢視所有、檢視除了自己以外的所有、摘除分離物件間外來鍵關係)

Django rest framework 常用外來鍵命令 (加入、刪除、檢視所有、檢視除了自己以外的所有、摘除分離物件間外來鍵關係)

依次介紹:加入、刪除、檢視所有、檢視除了自己以外的所有、摘除分離物件間外來鍵關係

model

class MyUser(AbstractUser):
    team=models.ForeignKey('myteam.Team',related_name='users',null=True,on_delete=models.SET_NULL) #所屬球隊

related_name表示其外來鍵反向檢索時用的欄位名,預設為 小寫的外來鍵model名_set。
on_delete代表當user在檢測到其所屬team被刪除時執行的操作,SET_NULL只在其外來鍵設定了null=True屬性時可用。

定義一個Team類的object team,
在team中新加一個隊員user:

team.users.add(user)

將一個隊員user_been_quit從其所屬的team中踢出:

team.users.remove(user_been_quit)

一個隊員檢視其所在team中所有隊員的資訊:
其中user.team表示獲取當前user所在隊的object,再使用user.team .users (users為外來鍵的realted_name)來反向查詢以獲取user所在隊的所有user。

serializers = MyUserPublicSerializer(user.team
.users,many=True) return Response(serializers.data,status=status.HTTP_200_OK)

隊長檢視除了自己所有人的資訊:
exclude和filter的作用相反,表示反選,也可以理解為filter(username!=user.username),但是不能這樣寫。

queryset = team.users.exclude(username=user.username)
serializers = MyUserPublicSerializer(queryset,many=True)
return Response(serializers.data
,status=status.HTTP_200_OK)

以上使用的team.users的型別為releted_manager,其擁有add、create、remove、clear、set等方法,其中clear方法可以實現摘除(解除)兩個model_object的外來鍵關係,並使得原先的object不被刪除,原話是:clear()

Removes all objects from the related object set:
    >>> b = Blog.objects.get(id=1)
    >>> b.entry_set.clear()
Note this doesn’t delete the related objects – it just disassociates(分離) them.

但是我沒能實現這個,所以使用

user.team.users.remove(user_been_quit)
team = models.ForeignKey('myteam.Team',related_name='users',null=True,on_delete=models.SET_NULL)
注意:on_delete=models.SET_NULL

既在需要分離物件之間的外來鍵關係時直接使用related_manage的remove方法來刪除這個user,但是user的model中設定了on_delete=models.SET_NULL方法來保護user不會真正的被刪除,只是將其外來鍵關係置為空來實現外來鍵關係的分離,以此來實現和clear類似的效果。