【问题标题】:Optionally retrieve related items in Django REST framework可选择在 Django REST 框架中检索相关项目
【发布时间】:2016-06-29 19:40:13
【问题描述】:

假设我有这些模型:

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”时返回这些预订,因为这是一项相对昂贵的操作,而不是通常需要。

我知道如何让它们随房子一起归还,但如何让它们成为可选的。我该怎么做?

【问题讨论】:

  • 这两个uris有什么区别?

标签: python django django-rest-framework


【解决方案1】:

首先,在/house/:houseId/bookings/ 存在用于预订给定房屋的端点更有意义(至少对我而言),因为/house/bookings/ 的命名空间已经在寻找ID。

您还可以序列化房屋和预订之间的关系,以在房屋详细信息端点显示房屋的预订。比如:

class HouseSerializer(serializers.ModelSerializer):
    bookings = BookingSerializer(many=True)

    class Meta:
        model = House
        fields = ('id','name', 'bookings',)

但是,如果您想要另一个端点,只需创建一个采用 BookingSerializer 的视图并通过 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'])

【讨论】:

  • 谢谢,我不知道ListAPIView,还是有点Django的初学者。
  • 是否也可以使用您提出的HouseSerializer,但默认不包括预订? (像一些参数,include_bookings=true)
  • 我将创建另一个序列化程序(可能是HouseSerializer 的子级),并在视图中覆盖get_serializer_class。此外,请查看此站点以帮助确定您可以使用哪些方法和属性:cdrf.co
【解决方案2】:

也许你可以做两个序列化程序,一个到房屋列表而不显示书籍,另一个用于单个房屋,显示书籍。

在视图中,您为列表 uri 定义列表序列化程序,并为单个 uri 定义单独的序列化程序。

【讨论】:

    【解决方案3】:

    事实证明,我正在尝试使用 API 的过于高级的部分,这些部分对我的限制超过了他们对我的帮助,我需要手动执行一些操作。

    这个答案https://stackoverflow.com/a/17763864/1582024 展示了如何实现资源层次结构。

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2015-09-08
      • 2016-10-13
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2017-02-04
      • 2018-07-21
      相关资源
      最近更新 更多