gpt4 book ai didi

python - Django: 'int' 对象在 View 集中有不同的序列化程序时不可迭代

转载 作者:行者123 更新时间:2023-12-04 15:17:32 28 4
gpt4 key购买 nike

我在此端点上发出 GET 请求时遇到问题:/api/vacancy/{hotel_id}/。它应该返回特定酒店 ID 的空缺信息。

在我的架构中,Vacancy 模型包含以下属性:

  • hotel_id 作为外键。
  • room_id 作为外键。
  • 空缺为整数。
  • 以整数形式出租。

为了获取相关信息,我打算通过 Vacancy Viewset 调用 HotelDetailsS​​erializer,认为这可能比过滤 Vacancy 表更容易根据 URL 中提供的 hotel_id 值,因为它会自动提供与该特定酒店 ID 相关的 Vacancy 集合。

http://localhost:8000/api/hotels/1 上发出 GET 请求(如下所示)提供了我需要的信息。但是,当我尝试通过具有此端点的 Vacancy Viewset 获得此响应时http://localhost:8000/api/vacancies/1 我收到以下错误:

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'
]

它的 Viewset,我在其中为 retrieve 类使用另一个 Serializer:

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 操作。

通过指定 HotelDetailsS​​erializer,当您获取 /api/vacancies/1/ 时,您会产生一个错误原因,它是一个 ID=1 的空缺实例,它被传递给那个serialzier 这显然是不对的,你应该只将酒店传递给 HotelDetailsS​​erializer

现在,酒店可以分配多个空位(您在 /api/hotels/1 响应中自己展示了它)。因此,如果您想通过 hotel_id 获取库存,那么请求应该返回该酒吧的多个空缺,而不是 1 个。

获取多个空缺的 API 是 GET/api/vacancies/,您只需传递一个查询参数来过滤它,如下所示:GET/api/vacancies/?hotel =1

您可以使用 django-filter 来实现它

按照文档中的说明安装后,将其添加到您的VacancyViewSet:

filterset_fields = ['hotel']

关于python - Django: 'int' 对象在 View 集中有不同的序列化程序时不可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64038809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com