djangorestframework:过滤相关字段
Posted
技术标签:
【中文标题】djangorestframework:过滤相关字段【英文标题】:djangorestframework: Filtering in a related field 【发布时间】:2013-09-08 16:00:13 【问题描述】:基本上,我想从 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 一起使用)。
如何过滤嵌套关系的查询集?
【问题讨论】:
【参考方案1】:我也很想看到更好的解决方案。我在我的序列化程序中使用了一个自定义方法来做到这一点。它有点冗长,但至少它是明确的。
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 (这是一种优化)。
【讨论】:
出于我的目的,目前这是一个非常好的解决方法。但是,像您一样,我很想知道是否有更好的解决方案:) 不幸的是,这种方法只适用于只读字段。正在寻找一个对编写也很友好的解决方案。 @dbro - 是的,这是只读的。自那个项目(2013 年)以来我没有使用过 DRF,所以我无能为力。您可能想问一个新问题。【参考方案2】:一种方法是在模型本身上创建一个方法并在序列化程序中引用它:
#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 ...
]
【讨论】:
以上是关于djangorestframework:过滤相关字段的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django Rest Framework 中过滤嵌套的序列化程序?
Django Rest Framework(多对多字段上的 GET 过滤器)
如何使用 Django Rest Framework 过滤器将过滤器链接在一起