假设我有这些模型:
class House(models.Model):
name = models.CharField(max_length=50)
# Other attributes
class Booking(models.Model):
house = models.ForeignKey(House, on_delete=models.CASCADE)
arrival_date = models.DateField()
departure_date = models.DateField()
序列化器:
class HouseSerializer(serializers.ModelSerializer):
class Meta:
model = House
fields = ('id','name')
class BookingSerializer(serializers.ModelSerializer):
class Meta:
model = Booking
fields = ('id',
'arrival_date',
'departure_date',
'house')
如您所见,预订与房屋相关联。
用户可以通过“/house/:houseId”请求房屋信息,通过“/booking/:bookingId”请求预订。
当用户请求“/house/bookings”时,我想返回所有与房屋相关的预订,但是当简单地请求“/house/bookings”时不应返回这些,因为这是一个相对昂贵的操作,而不是通常需要。
我知道如何让它们与房子一起归还,但如何让它成为可选的。我该怎么做?
请您参考如下方法:
首先,将给定房屋的预订端点存在于 /house/:houseId/bookings/ 更有意义(至少对我而言)因为命名空间在 /house/bookings/已经在寻找 ID。
您还可以序列化房屋和预订之间的关系,以在房屋详细信息端点显示房屋的预订。像这样的东西:
class HouseSerializer(serializers.ModelSerializer):
bookings = BookingSerializer(many=True)
class Meta:
model = House
fields = ('id','name', 'bookings',)
但是,如果您想要另一个端点,只需创建一个采用 BookingSerializer 的 View 即可并通过 kwargs 中的 House ID 过滤查询集:
(同样,假设您的端点是 /house/<house_id>/bookings/ )
class BookingsForHouseListView(ListAPIView):
serializer_class = BookingSerializer
def get_queryset(self):
return Bookings.objects.filter(house__id=self.kwargs['house_id'])
