过滤的嵌套关系Django Rest Framework [英] Filtered Nested Relationships Django Rest Framework

查看:49
本文介绍了过滤的嵌套关系Django Rest Framework的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个模型,如下所示:

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)

和...

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

我的问题是我只想检索特定年份的评估.例如,如果我将 2017 作为感兴趣的年份,则我不希望像我目前所获得的那样检索 2016 的评估.

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.

编辑1 我的views.py如下:

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

推荐答案

这是为我解决此问题的解决方案:

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.

如何在Django REST框架中将过滤器应用于嵌套资源?

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

这篇关于过滤的嵌套关系Django Rest Framework的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆