假设我有一个像这样的模型:
class Car(models.Model):
images = models.ManyToManyField(Image)
class Image(models.Model):
path = models.CharField()
type = models.CharField()
我想公开两个API视图:
在列表视图中,我只想显示type =“thumbnail”的图像。在详细信息视图中,我想显示type =“image”的图像。
这或多或少是列表的样子:
[{
"id": 1,
"images": [1, 2],
},
{
"id": 2,
"images": [3, 4],
}]
详细信息视图:
{
"id": 1,
"images": [5],
}
请注意,根据视图显示不同的图像ID。
到目前为止,我的序列化程序看起来像这样:
class CarSerializer(serializers.ModelSerializer):
images = serializers.ManyPrimaryKeyRelatedField()
class Meta:
model = Car
列出api视图:
class CarList(generics.ListAPIView):
model = Car
serializer_class = CarSerializer
详细信息api视图:
class CarDetails(generics.RetrieveAPIView):
model = Car
serializer_class = CarSerializer
这当然为我提供列表中的所有图像以及详细信息,并强制客户进行额外调用以获取应显示的图像类型。
有没有通用的方法呢?我已经看过django-filter示例,但似乎只能过滤列出哪些对象,而不是列出所列对象中的相关对象。
答案 0 :(得分:3)
我不知道你是否还在寻找这个答案,但也许它可以帮助其他人。
首先创建一个这样的过滤器类:
class CarFilter(django_filters.FilterSet):
having_image = django_filters.Filter(name="images", lookup_type='in')
class Meta:
model = Car
然后将过滤器添加到您的视图中:
class CarList(generics.ListAPIView):
model = Car
serializer_class = CarSerializer
filter_class = CarFilter
就是这样。在您的查询字符串中添加“?having_image = 1”,Django过滤器应该为您完成。
希望有所帮助......
答案 1 :(得分:1)
我找到了另一个Stackoverflow问题,该问题有一个可以在这里使用的解决方案:
How can I apply a filter to a nested resource in Django REST framework?
(参见"解决方案"问题本身的标题)