33

基本的に、ModelSerializer の関連フィールドから非アクティブなユーザーを除外したいと考えています。関連フィールドのクエリセットを動的に制限することと、次のことを試しました。

class MySerializer(serializers.ModelSerializer):
  users = serializers.PrimaryKeyRelatedField(queryset=User.objects.filter(active=True), many=True)
  class Meta:
    model = MyModel
    fields = ('users',)

これらのアプローチはどちらも、クエリセットをフィルタリングするだけでは機能しませんでした。ネストされた関連する Serializer クラスに対してフィールドとしてこれを実行したい (ただし、RelatedField で動作させることさえできませんでした)。

ネストされたリレーションのクエリセットをフィルタリングするにはどうすればよいですか?

4

2 に答える 2

36

より良い解決策も見てみたいと思います。それを行うために、シリアライザーでカスタムメソッドを使用しました。もう少し冗長ですが、少なくとも明示的です。

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 は必要ありません (これは最適化でした)。

于 2013-09-05T03:53:13.030 に答える
3

これを行う 1 つの方法は、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 ...
        ]
于 2020-10-06T07:50:56.333 に答える