2017-02-10 4 views
0

私は次のように見える二つのモデルがあります:フィルタリングされた入れ子の関係はDjangoフレームワーク休憩

class Subject(models.Model): 

    subject_code = models.CharField(max_length=12, unique=True) 
    name = models.CharField(max_length=100) 
    dept_code = models.CharField(max_length=6) 

と...私は私が取得するように私のシリアライズを作成している

class Subject_assessment(models.Model):  
    subject_code = models.ForeignKey(Subject, related_name='sub_assessments') 
    year = models.CharField(max_length=4) 
    name = models.CharField(max_length=50) 

を被験者は、その被験者に関連する評価も取得します。私はこれを達成するために、次のシリアライザを使用しています:

class AssessmentsSerializer(serializers.ModelSerializer): 
class Meta: 
    model = Subject_assessment 
    fields = (
     "subject_code", "year", "name" 
    ) 

class SubjectSerializer(serializers.ModelSerializer): 
sub_assessments = AssessmentsSerializer(many=True) 
class Meta: 
    model = Subject 
    fields = (
     "subject_code", "name", "dept_code",    
     "sub_assessments" 
    ) 

予想通り、それは私にこのような結果与えるので、このコードは完璧に動作します:

{ 
"subject_code":"ECR2243", 
"name":"Statistics", 
"dept_code":"Stats", 
"sub_assessments":[ 
    { 
     "subject_code":"ECR2243", 
     "year":"2017", 
     "name":"Test 1" 
    }, 
    { 
     "subject_code":"ECR2243", 
     "year":"2016", 
     "name":"Test 1" 
    } 
] 
} 

私の問題は、私だけのための評価を取得したいということですが特定の年たとえば、を対象年として渡した場合、私は現在取得中のようにの評価を取得したくありません。

これを達成するために誰でも自分のコードをどのように構造化することができますか?前もって感謝します。


編集1 次のように私のviews.pyは以下のとおりです。

class SubjectViewSet(viewsets.ModelViewSet): 
serializer_class = SubjectSerializer 
lookup_field = 'subject_code' 

def get_queryset(self): 
    qry_subject_code = self.request.GET.get('subject_code') 
    retrieved_sub = Subject.objects.filter(subject_code=qry_subject_code) 
    return retrieved_sub 
+0

あなたはview.py – marin

+0

チェックhttp://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-argumentsとのご質問を展開することができます。それはあなたのシリアライザに余分なパラメータを渡す方法の詳細を持っています。これは、ソリューションを構築するのに役立ちます。 –

+0

@marin私は自分のviews.pyを追加しました – Tatenda

答えて

0

これはに私のために働いたソリューションです。この質問:

class FilteredAssessmentsSerializer(serializers.ListSerializer): 
    def to_representation(self,data): 
     qry_year = self.context['request'].GET.get('year') 
     data = data.filter(year=qry_year) 
     return super(FilteredAssessmentsSerializer, self).to_representation(data) 

class AssessmentsSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Subject_assessment 
     list_serializer_class = FilteredAssessmentsSerializer 
     fields = '__all__' 

class SubjectSerializer(serializers.ModelSerializer): 
    sub_assessments = AssessmentsSerializer(many=True) 
    class Meta: 
     model = Subject 
     fields = (
      "subject_code", "name", "dept_code", 
      "faculty_code", "university_code", "description", 
      "sub_assessments" 
     ) 

参考:次の解決策を組み合わせて、私に合ったものを考え出しました。

How can I apply a filter to a nested resource in Django REST framework?

https://stackoverflow.com/a/28354281/7210105

0

あなたは、このクエリを試すことができます:

retrieved_sub = Subject_assessment.objects.filter(subject_code__in=Subject.objects.filter(subject_code=qry_subject_code),year='2014').all() 
+0

働いていません。 .all()をそこに置く理由は何でしょうか? – Tatenda

+0

そのURLを呼び出すときに、いくつかのprint#retrieve_sub#を実行できますか? .all()はクエリからすべての値を返します。 – marin

+0

質問が正しく表示されているかどうかわかりません。私のコードは、DBから結果を返す、質問を確認します。私の質問は、 – Tatenda

関連する問題