0

django rest-farmeworkを使用してAPIを実装すると解決できない問題があります:view.pyを使用してパラメータをserializers.pyに渡す方法はありますか?特定のコードは以下の通りである:django rest-farmeworkネストされた関係でパラメータを渡す

models.py

class Category(models.Model): 
    name = models.CharField(max_length=30) 
    amount = models.IntegerField() 

class Source(models.Model): 
    name = models.CharField(max_length=50) 
    rss_link = models.URLField() 
    amount = models.IntegerField() 
    # ForeignKey 
    category = models.ForeignKey(Category) 

views.py

class CategoryListView(APIView): 
    def get(self, request): 
     # How should this variable be passed to serializers.py? 
     num_parameter = request.GET.get("num") 

     category = Category.objects.all() 
     serializers = CategorySerializers(category, many=True) 
     return Response(serializers.data) 

serializers.py

class SourceSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Source 
     fields = ("id","name","amount") 

class CategorySerializer(serializers.ModelSerializer): 
    source_set = serializers.SerializerMethodField('get_sources') 

    def get_sources(self, category): 
     sources = category.source_set.filter(amount=0) 
     # I expect the code as follows,the "num_parameter" from views.py 
     # sources = category.source_set.filter(amount=num_parameter) 

     return SourceSerializer(instance=sources, many=True).data 

    class Meta: 
     model = Category 
     fields = ("id", "name", "amount", "source_set") 

プログラムの実行結果:

[ 
    { 
     "id": 1, 
     "name": "study", 
     "amount": "0", 
     "source": [ 
      { 
       "id": 34, 
       "name": "java", 
       "amount": "0" 
      }, 
      { 
       "id": 35, 
       "name": "python", 
       "amount": "0" 
      } 
     ] 
    } 
] 
、どのように "CategorySerializer" それを渡すために "CategoryListView" からである

sources = category.source_set.filter(amount=0) 

sources = category.source_set.filter(amount=num_parameter) 

"num_parameter" へ:注釈を付けたよう

は、次のコードを修正しましたか?

ありがとうございます。

答えて

1

あなたはシリアライザのコンテキストにアクセスすることができますあなたのケースでは

def get_sources(self, category): 
    num_parameter = self.context['request'].query_params['num'] 
    sources = category.source_set.filter(amount=num_parameter) 

を、あなたは、シリアライザをインスタンス化する際に、コンテキストを渡す必要があります:

CategorySerializers(category, many=True, context={'request': request}) 

ジェネリックGenericAPIViewsを使用している場合これは、通常は自動的に行われます。

+0

'' self.context''の結果は '' {} ''なので、 '' self.context ['request'] ''はエラーです "例外値: 'request'"。 – jason

+0

私の悪いです。更新しました。コンテキストを手動で渡す必要があります。 – JoseKilo

+0

問題はあなたの助けによって解決されます、ありがとうございます!@JoseKilo – jason

関連する問題