我有以下models.py
:
class Question(models.Model):
code = models.CharField(max_length=12)
text = models.CharField(max_length=1000,null=True)
catgeroy = models.ForeignKey(
Category,on_delete=models.PROTECT,null=True,blank=True,db_index=True,related_name='category')
class Answer(models.Model):
question = models.ForeignKey(
Question,related_name='question')
exam = models.ForeignKey(Exam,on_delete=models.CASCADE)
value = models.FloatField(null=True,blank=True)
class Exam(models.Model):
year = models.IntegerField()
我嵌套的serializer
看起来像这样:
class AnswerSerializer(serializers.ModelSerializer):
related_name = 'answer'
class Meta:
model = Value
fields = ('id','value','question','exam')
class nestedQuestionAnswerSerializer(serializers.ModelSerializer):
answer = AnswerSerializer(many=True,read_only=True)
class Meta:
model = Question
fields = (
'id','code','text','answer'
)
我的views.py
看起来像这样:
class QuestionAnswerViewSet(BaseCertViewSet):
queryset = Question.objects.all()
serializer_class = serializers.nestedQuestionAnswerSerializer
filter_backends = [filters.DjangoFilterBackend]
filterset_fields = ('category',)
我的urls.py
看起来像这样:
router.register('question-answer',views.QuestionAnswerViewSet,'question-answer')
我想做的是同时按类别和考试进行过滤(这是一个子属性)。所以像这样:https://example.com/api/question-answer?category=4&exam=21
这可能应该返回所有属于category = 4并出现在exam = 21上的问题。
我单独使用category
进行过滤没有问题,但是似乎无法对作为子外键的exam
进行过滤。
我已经尝试了许多关于SO的解决方案,但似乎没有一个能解决上述问题。
更新:
感谢大家提出的建议解决方案。
我最终使用了this solution
添加了列表序列化器类并修改了to_representation
函数:
class FilteredAnswerSerializer(serializers.ListSerializer):
def to_representation(self,data):
qry_exam = self.context['request'].GET.get('exam')
data = data.filter(exam=qry_exam)
return super(FilteredAnswerSerializer,self).to_representation(data)
,然后在我的Answer序列化程序中将其命名为:
class AnswerSerializer(serializers.ModelSerializer):
related_name = 'answer'
class Meta:
model = Value
list_serializer_class = FilteredAnswerSerializer
fields = ('id','exam')