Skip to main content
 首页 » 编程设计

python之可选地检索 Django REST 框架中的相关项目

2024年10月17日30落叶无声

假设我有这些模型:

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