簡體   English   中英

Django:當視圖集中有不同的序列化程序時,“int”對象不可迭代

[英]Django: 'int' object is not iterable when different serializers in a Viewset

在此端點上發出GET請求時遇到問題: /api/vacancy/{hotel_id}/ 它應該返回特定酒店 ID 的空缺信息。

在我的架構中,Vacancy 模型包含以下屬性:

  • hotel_id 作為外鍵。
  • room_id 作為外鍵。
  • 空位為整數。
  • 作為整數租用。

為了獲取相關信息,我打算上調用HotelDetailsSerializer通過Vacancy Viewset ,認為它可能比具有根據過濾空缺表更容易hotel_id在URL提供的價值,因為它會自動提供相關的空缺集合到那個特定的酒店 ID。

http://localhost:8000/api/hotels/1上發出GET請求(如下所示)提供了我需要的信息。 但是,當我嘗試通過具有此端點http://localhost:8000/api/vacancies/1Vacancy 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM