gpt4 book ai didi

django - DRF 串行器过滤

转载 作者:行者123 更新时间:2023-12-04 03:09:12 24 4
gpt4 key购买 nike

我有一个序列化程序,可以让我一切正常。

ModelClassASerializer((serializers.ModelSerializer)):
.....

status = serializers.SerializerMethodField()


def get_status(self, obj):
....
status = ModelB.objects.get(id=obj.id).status
....
return status

class Meta:
model = ModelClassA
fields = (...)

但是,如果我想根据该状态进行过滤,则不能。我正在使用 django_filters.rest_framework.FilterSet 进行过滤。模型之间没有关系。

进行过滤的最佳方法是什么?

最佳答案

它看起来像 ModelA 中的对象与 ModelB 中的 ID 共享相同的 ID .如果是这种情况,您可以使用子查询来匹配 ID。如果 ID 彼此不对应,则此查询将是无意义的。您要创建以下查询集:

from django.db.models import Subquery
from myapp.models import ModelA, ModelB

pks = ModelB.objects.filter(status='foo').values('pk')
ModelA.objects.filter(pk__in=Subquery(pks))

要创建上面的 django-filter,你需要使用 method关于过滤器的参数。

from django_filters import rest_framework as filters

class ModelAFilter(filters.FilterSet):
status = filters.ChoiceFilter(choices=(('foo', 'Foo'), ...), method='filter_status')

class Meta:
model = ModelA
fields = []

def filter_status(self, queryset, name, value):
pks = ModelB.objects.filter(status=value).values('pk')
return queryset.filter(pk__in=Subquery(pks))

关于django - DRF 串行器过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com