如何使用 Django REST 框架根据字段过滤关系



我有三种型号:房子,居民,汽车。 每所房子都有许多居民(一对多(。每个居民有0或1辆车(一对一(。 对于我的前端,我想显示房子里所有有车的居民。 Django Rest 框架建议使用过滤,但这只适用于顶层。例如,在我的HouseDetailView(generics.RetrieveAPIView)中,我只能修改房屋模型本身的查询集。我希望能够修改常驻(resident_queryset.exclude(car=None)(的查询集。

class HouseDetailView(generics.RetrieveAPIView):
queryset = House.objects.all()
serializer_class = HouseSerializer

我可以/应该在一个请求中完成所有这些操作吗? 查询参数是我唯一的筛选方法吗?

# If you want to display all the residents of a house that have a car, then you should query the car model

class CarDetailView(generics.RetrieveAPIView):
queryset = Car.objects.all()
serializer_class = CarSerializer

serializers.py
class CarSerializer(serializers.ModelSerializer):
# get the resident details (name)
resident_name = serializers.SerializerMethodField('get_resident_name')
def get_resident_name(self, obj):
return obj.resident.name

class Meta:
model = Car
fields = ("name", "resident_name")

您可以使用Prefetch来过滤相关对象:

from django.db.models import Prefetch
class HouseDetailView(generics.RetrieveAPIView):
serializer_class = HouseSerializer
def get_queryset(self):
return House.objects.prefetch_related(Prefetch('resident_set', queryset=Resident.objects.exclude(car__isnull=True)))

注意resident_setResident模型的反向名称,根据related_name参数可能会有所不同。

最新更新