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" 
      } 
     ] 
    } 
] 

В аннотированный, модифицировали следующий код:

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

к

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

"num_parameter" от "CategoryListView", как передать его "CategorySerializer"?

Заранее спасибо.

ответ

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'] '' is error "Exception Value: 'request'". – jason

+0

Мой плохой. Обновлено. Вам нужно вручную передать контекст. – JoseKilo

+0

Проблема решена вашей помощью, большое спасибо! @JoseKilo – jason

Смежные вопросы