簡體   English   中英

序列化器中的過濾 Django rest 框架

[英]Filtering in serializers Django rest framework

在我的項目中,一個房間有不同的狀態,例如:已注冊,可用,每個狀態都有一個開始日期,我必須在狀態注冊時獲取 start_date。 我怎樣才能在序列化程序中做到這一點? 提前致謝!

在 model.py 中:

 class RoomStatus(models.Model):
  room = models.ForeignKey(Room, on_delete=models.DO_NOTHING, related_name='rooms')

  class RoomStatusChoices(models.IntegerChoices):
    REGISTERED = 1
    RESERVED = 2
    AVAILABLE = 3


  room_status = models.SmallIntegerField(choices=RoomStatusChoices.choices, default=RoomStatusChoices.AVAILABLE)
  start_date = models.DateTimeField(default=timezone.now())

在 serializers.py 中:

 class RoomStatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = RoomStatus
        fields = ['id', 'start_date']

 class RoomSerializer(serializers.ModelSerializer):
  rooms = RoomStatusSerializer(many=True)

   class Meta:
     model = Room
     fields = ['id', 'rooms']   

在views.py中:

 class RoomViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet, UpdateModelMixin):
   queryset = Room.objects.all()
   serializer_class = RoomSerializer

如果我理解正確,您可以執行以下操作:

但重要說明:

  • 您必須處理 room=pk 或 status=1 的 RoomStatus 不存在的情況。
  • 如果您的 model RoomStatusroomroom_status沒有唯一約束,您必須處理有多個對象返回的情況,這將在使用.get()時引發錯誤
from .models import RoomStatus

class RoomSerializer(serializers.ModelSerializer):
    register_date = serializers.SerializerMethodField()

    def get_register_date(self, obj):
        return RoomStatus.objects.get(room=obj.pk, room_status=1).start_date

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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