基本上,我想从ModelSerializer的相关字段中过滤掉非活动用户。我尝试了Dynamically limiting queryset of related field以及以下内容:
class MySerializer(serializers.ModelSerializer):
users = serializers.PrimaryKeyRelatedField(queryset=User.objects.filter(active=True), many=True)
class Meta:
model = MyModel
fields = ('users',)
这些方法都不适用于仅过滤查询集。我希望将嵌套相关的Serializer类作为一个字段来执行此操作(但是甚至无法使其与RelatedField一起使用)。
如何过滤嵌套关系的查询集?
答案 0 :(得分:26)
我很想看到更好的解决方案。我在序列化程序中使用了自定义方法来做到这一点。它有点冗长但至少它是明确的。
一些伪代码,其中GarageSerializer会过滤汽车的嵌套关系:
class MyGarageSerializer(...):
users = serializers.SerializerMethodField('get_cars')
def get_cars(self, garage):
cars_queryset = Car.objects.all().filter(Q(garage=garage) | ...).select_related()
serializer = CarSerializer(instance=cars_queryset, many=True, context=self.context)
return serializer.data
显然用你想要的任何东西替换查询集。您并不总是需要提供上下文(我用它来检索嵌套序列化程序中的一些查询参数),您可能不需要.select_related(这是一个优化)。
答案 1 :(得分:0)
一种方法是在Model本身上创建一个方法,并在序列化程序中对其进行引用:
#Models.py
class MyModel(models.Model):
#...
def my_filtered_field (self):
return self.othermodel_set.filter(field_a = 'value_a').order_by('field_b')[:10]
#Serialziers.py
class MyModelSerialzer(serializers.ModelSerializer):
my_filtered_field = OtherModelSerializer (many=True, read_only=True)
class Meta:
model = MyModel
fields = [
'my_filtered_field' ,
#Other fields ...
]