过滤嵌套关系Django的REST框架
问题描述:
我有两个型号,看起来像下面这样:过滤嵌套关系Django的REST框架
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
答
这是为我工作的解决方案这个问题:
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?
答
你可以尝试用此查询:
retrieved_sub = Subject_assessment.objects.filter(subject_code__in=Subject.objects.filter(subject_code=qry_subject_code),year='2014').all()
你能扩大与view.py – marin
检查你的问题http://www.django-rest-framework.org/api-guide/serializers/#additional-keyword-arguments 。它详细介绍了如何将额外参数传递给序列化程序。它可以帮助您构建解决方案。 –
@marin我已添加我的views.py – Tatenda