1

私はすべての細かいことを与えるシリアライザを持っています。DRFシリアライザフィルタリング

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を使用しています。モデル間には関係がありません。

フィルタリングを行うにはどのような方法が最適ですか?

+1

あなたのモデルはどのように関係していますか?あなたはそれを見せてもらえますか?おそらく[source](http://www.django-rest-framework.org/api-guide/fields/#source)があなたを助けることができます。 –

+0

申し訳ありませんが、2つのモデルの間には関係はありません。私の質問を更新しました。すでにドキュメントをチェックしても、答えが見つかりませんでした。 – digode

+1

あなたはコードサンプルを提供しましたが、何をしようとしている/何をしたいのかが明確ではありません。特に、なぜシリアライザでフィルタリングしますか?フィルタリングは通常、ビューからのデータセットに適用されますが、なぜあなたのケースでそれが違うのですか? – Linovia

答えて

1

ModelAのオブジェクトは、ModelBと同じ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のでしょう、あなたがフィルターに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)) 
関連する問題