【问题标题】:Filtered Nested Relationships Django Rest Framework过滤的嵌套关系 Django Rest 框架
【发布时间】:2017-06-28 15:43:23
【问题描述】:

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

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

我的问题是我只想检索特定年份的评估。例如,如果我通过 2017 作为感兴趣的年份,我不希望像现在这样检索 2016 的评估。

任何人都可以帮助我如何构建我的代码以完成此任务。提前谢谢你。


编辑 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

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

这是对我有用的解决方案:

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

【讨论】:

    【解决方案2】:

    你能试试这个查询吗:

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

    【讨论】:

    • 不工作。将 .all() 放在那里的原因是什么?
    • 当您调用该 URL 时,您可以打印一些 #retrived_sub# 吗?因为 .all() 将返回查询中的所有值。
    • 不确定我的问题是否正确。我的代码正在从数据库返回结果,请检查问题。我的问题是如何按年份过滤嵌套序列化程序的结果
    • 您的建议可用于检索所需的输出。但是我不会将其标记为答案,因为它会更改我需要输出的形式。我仍然需要相关主题的详细信息,而无需运行另一个查询。
    • 如果您发现除此之外的其他方法,请用答案更新您的问题。 @Tatenda
    猜你喜欢
    • 2018-05-17
    • 2014-09-18
    • 1970-01-01
    • 2016-05-14
    • 2016-05-30
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多