Filtered Nested Relationships Django Rest Framework

流过昼夜 提交于 2021-01-20 07:07:39

问题


I have two models which look like the following:

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)

and...

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)

I have created my serializes in such a way that when I retrieve a subject, I also retrieve the assessments associated with that subject. I am using the following serializers to accomplish this:

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"
    )

This code works perfectly as anticipated as it gives me a result like this:

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

My problem is that I wish to retrieve assessments only for a specific year. For example, If I pass 2017 as the year of interest, I do not wish to retrieve assessments for 2016 like I am currently getting.

Can anyone please assist on how I can structure my code in order to accomplish this. Thank you in advance.


Edit 1 My views.py is as follows:

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

回答1:


This is the solution that worked for me to this question:

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"
       )

Reference: I combined the following solutions to come up with one that suits me.

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

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




回答2:


Can you try with this query:

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


来源:https://stackoverflow.com/questions/42156901/filtered-nested-relationships-django-rest-framework

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!