![](/img/trans.png)
[英]Accessing Request Object in Viewset and Serializers in Django Rest Framework?
[英]Django: 'int' object is not iterable when different serializers in a Viewset
在此端點上發出GET
請求時遇到問題: /api/vacancy/{hotel_id}/
。 它應該返回特定酒店 ID 的空缺信息。
在我的架構中,Vacancy 模型包含以下屬性:
為了獲取相關信息,我打算上調用HotelDetailsSerializer
通過Vacancy Viewset
,認為它可能比具有根據過濾空缺表更容易hotel_id
在URL提供的價值,因為它會自動提供相關的空缺集合到那個特定的酒店 ID。
在http://localhost:8000/api/hotels/1
上發出GET
請求(如下所示)提供了我需要的信息。 但是,當我嘗試通過具有此端點http://localhost:8000/api/vacancies/1
的Vacancy Viewset
獲取此響應時,出現以下錯誤:
TypeError at /api/vacancies/1/
'int' object is not iterable
那么,我首先嘗試做的事情是否可行,或者是否有更好的方法或最佳實踐可以應用在這里?
感謝您的回復!
這是我的Vacancy Serializer
程序文件:
from rest_framework import serializers
from ..models.model_vacancy import Vacancy
from .serializers_room import *
from .serializers_hotel import *
class VacancyIndexSerializer(serializers.ModelSerializer):
"""
Serializer listing all Vacancies models from DB
"""
room_id = RoomIndexSerializer(allow_null=True)
class Meta:
model = Vacancy
fields = [
'room_id',
'hotel_id',
'vacancy',
'rented'
]
class VacancyDetailsSerializer(serializers.ModelSerializer):
"""
Serializer showing details of a Vacancy model from DB
"""
room_id = RoomDetailsSerializer()
class Meta:
model = Vacancy
fields = [
'room_id',
'vacancy',
'rented'
]
class VacancyCreateSerializer(serializers.ModelSerializer):
"""
Serializer to create a Vacancy model in DB
"""
class Meta:
model = Vacancy
fields = [
'room_id',
'hotel_id',
'vacancy',
'rented'
]
def create(self, validated_data):
vacancy = Vacancy.objects.create(**validated_data)
return stock
class VacancyUpdateSerializer(serializers.ModelSerializer):
"""
Serializer declaring fields to be provided to update the Vacancy instance.
"""
class Meta:
model = Vacancy
fields = [
'room_id',
'hotel_id',
'vacancy',
'rented'
]
我在其中使用另一個Serializer
程序作為retrieve
類的Viewset
:
from rest_framework import viewsets
from ..models.model_vacancy import Vacancy
from ..serializers.serializers_vacancy import *
from ..serializers.serializers_hotel import *
class VacancyViewSet(viewsets.ModelViewSet):
"""
Vacancy ViewSet calling various serializers depending on request type (GET, PUT etc.)
"""
queryset = Vacancy.objects.order_by('id')
# mapping serializer into the action
serializer_classes = {
'list': VacancyIndexSerializer,
'retrieve': HotelDetailsSerializer,
'create': VacancyCreateSerializer,
'update': VacancyUpdateSerializer,
'partial_update': VacancyUpdateSerializer
}
# Your default serializer
default_serializer_class = VacancyIndexSerializer
def get_serializer_class(self):
"""
Method to detect request type (GET, PUT etc.) and select corresponding serializer.
"""
return self.serializer_classes.get(self.action, self.default_serializer_class)
這是我的另一個Serializer
:
from rest_framework import serializers
from ..models.model_hotel import Hotel
from .serializers_vacancy import *
class HotelIndexSerializer(serializers.ModelSerializer):
"""
Serializer listing all Hotels models from DB
"""
class Meta:
model = Hotel
fields = [
'id',
'name',
]
class HotelDetailsSerializer(serializers.ModelSerializer):
"""
Serializer showing details of a Hotel model from DB
"""
vacancy = VacancyDetailsSerializer(many=True)
class Meta:
model = Hotel
fields = [
'vacancy'
]
class HotelCreateSerializer(serializers.ModelSerializer):
"""
Serializer to create a Hotel model in DB
"""
class Meta:
model = Hotel
fields = [
'name',
]
class HotelUpdateSerializer(serializers.ModelSerializer):
"""
Serializer declaring fields to be provided to update the Hotel instance.
"""
class Meta:
model = Hotel
fields = [
'name',
]
在 Postman 中,當我在http://localhost:8000/api/hotels/1
上請求GET
,我得到:
{
"vacancy": [
{
"room_id": {
"room": "first",
"name": "first one",
"description": "description"
},
"vacancy": 10,
"rented": 0
},
{
"room_id": {
"room": "second",
"name": "second one",
"description": "description"
},
"vacancy": 10,
"rented": 0
}
]
}
當為空置模型配置時,您不能強制ModelViewset
返回酒店以進行retreive
操作。
通過在那里指定HotelDetailsSerializer
,當您獲取/api/vacancies/1/
它是一個 ID=1 的空置實例被傳遞給該序列化器時,您會產生錯誤原因,這顯然是不正確的,您應該只將 hotel 傳遞給HotelDetailsSerializer
。
現在,一家酒店可以分配多個空缺(您在/api/hotels/1
響應中自己展示過)。 因此,如果您想通過hotel_id
獲取股票,那么請求應該返回該酒吧的多個空缺,而不是 1。
獲取多個空缺職位的 API 是GET /api/vacancies/
,您只需要傳遞一個查詢參數來過濾它,如下所示: GET /api/vacancies/?hotel=1
你可以用django-filter
來實現它
按照文檔中的說明安裝后,將其添加到您的VacancyViewSet
:
filterset_fields = ['hotel']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.