![](/img/trans.png)
[英]In a Django Rest Framework 3 Serializer how do I access the request object?
[英]How to access extra data sent with POST request in Django Rest Framework serializer
我正在嘗試發送帶有創建組的POST
請求的額外數組。
POST /groups/
{
"name": “New Group“,
"users_to_invite": [ 1, 2, 6 ]
}
我正在使用Django Rest Framework
的ListCreateAPIView
來處理請求:
class GroupListView(ListCreateAPIView):
queryset = Group.objects.all()
def get_serializer(self, *args, **kwargs):
kwargs['context'] = self.get_serializer_context()
# Use a dedicated serializer to inspect the field with users to invite
if self.request.method == 'POST':
return GroupCreateSerializer(*args, **kwargs)
return GroupSerializer(*args, **kwargs)
我想獲取序列化程序中users_to_invite
數組的內容以創建邀請對象。 但是,我無法這樣做,因為在序列化程序中訪問數組時,數組以某種方式不存在。
class GroupCreateSerializer(ModelSerializer):
def create(self, validated_data):
# Get user ids to invite
# !! It fails here !!
invitations_data = validated_data.pop('users_to_invite')
# TODO: Iterate over ids and create invitations
# Create a group
group = Group.objects.create(**validated_data)
return group
class Meta:
model = Group
fields = ('id', 'name', )
數組不存在,所以自然會出現錯誤:
File "...my_api/serializers.py", line 303, in create
invitations_data = validated_data.pop('users_to_invite')
KeyError: 'users_to_invite'
我如何使數組出現在那里? 修改模型聽起來不是一個好主意,因為我不想存儲數組中的內容。
validated_data
中不存在額外的數據,您可以嘗試使用self.context['request']
詳細信息: includes -extra-context ,默認情況下 ,它已添加到視圖的get_serializer方法中
對於您的情況:
def create(self, validated_data):
# Get user ids to invite
# !! It fails here !!
request = self.context['request']
invitations_data = request.data.get('users_to_invite')
要發送額外的上下文數據,您應該從方法def get_serializer_context(self)
傳遞它,並在序列化程序內部進行訪問,例如self.context.get("key")
。
樣例代碼:
class GroupListView(ListCreateAPIView):
queryset = Group.objects.all()
def get_serializer_context(self):
context = super(GroupListView, self).get_serializer_context()
context["users_to_invite"] = request.data.get("users_to_invite")
return context
class GroupCreateSerializer(ModelSerializer):
def create(self, validated_data):
users_to_invite = self.context.get("users_to_invite")
# do whatever you want
除了將數據添加到上下文之外,還可以將字段users_to_invite
作為CharField
添加到序列化程序。
范例 :
import json
class GroupCreateSerializer(ModelSerializer):
def create(self, validated_data):
# Get user ids to invite
# !! It fails here !!
invitations_data = json.loads(validated_data.pop('users_to_invite'))
# TODO: Iterate over ids and create invitations
# Create a group
group = Group.objects.create(**validated_data)
return group
users_to_invite = serializers.CharField(required=False)
class Meta:
model = Group
fields = ('id', 'name', 'users_to_invite', )
注意:確保在請求數據中以字符串形式包含users_to_invite
。 像: '[1, 2, 3]'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.