Фильтрация в сериализаторах Django rest framework
В моем проекте комната имеет различные статусы, например: зарегистрирован, доступен, каждый статус имеет дату начала, мне нужно получить дату начала_даты, когда статус зарегистрирован. Как я могу сделать это в сериализаторе? Заранее спасибо!
в 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
Если я правильно понял, вы можете сделать что-то вроде этого:
Однако важные замечания:
- Вы должны обработать случай, когда RoomStatus с room=pk или status=1 не существует.
- Если ваша модель
RoomStatus
не имеет уникального ограничения дляroom
иroom_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