我正在使用 Django 休息框架 2.3 我有这样的类(class)
class Quiz():
fields..
# A custom manager for result objects
class SavedOnceManager(models.Manager):
def filter(self, *args, **kwargs):
if not 'saved_once' in kwargs:
kwargs['saved_once'] = True
return super(SavedOnceManager, self).filter(*args, **kwargs)
class Result():
saved_once = models.NullBooleanField(default=False, db_index=True,
null=True)
quiz = models.ForeignKey(Quiz, related_name='result_set')
objects = SavedOnceManager()
如您所见,我有一个自定义结果管理器,因此 Result.objects.filter()
将仅返回将 save_once 设置为 True 的结果
现在我的序列化器看起来像这样:
class ResultSerializer(serializers.ModelSerializer):
fields...
class QuizSerializer(serializers.ModelSerializer):
results = ResultSerializer(many=True, required=False, source='result_set')
现在,如果我序列化我的测验,它将只返回将 saved_once
设置为 True
的结果。但是对于特定的用例,我希望序列化程序返回所有对象。我读过我可以通过传递 queryset
参数来做到这一点 http://www.django-rest-framework.org/api-guide/relations/在(进一步注释部分)。但是当我尝试这个时
results = ResultSerializer(many=True, required=False, source='result_set',
queryset=
Result.objects.filter(
saved_once__in=[True, False]))
我得到 TypeError: __init__() got an unexpected keyword argument 'queryset'
查看 DRF 的源代码(至少在我的版本中)它不接受查询集参数。
正在寻求一些指导,看看这是否可能...谢谢!
最佳答案
在我看来,像这样修改过滤器不是一个很好的做法。当我无法在 Result 模型上使用过滤器而不发生这种额外的过滤时,很难为您编写解决方案。我建议不要以这种方式修改过滤器,而是创建一个自定义管理器方法,该方法允许您以明显的方式在需要的地方应用过滤器,例如/
class SavedOnceManager(models.Manager):
def saved_once(self):
return self.get_queryset().filter('saved_once'=True)
因此,您可以按预期查询 saved_once 行或未过滤的行:
Results.objects.all()
Results.objects.saved_once().all()
这是一种可以在序列化程序中使用附加查询集的方法。但是,在我看来,如果默认管理器以某种方式过滤掉 saved_once 对象,这很可能对您不起作用。因此,您的问题出在其他地方。
class QuizSerializer(serializers.ModelSerializer):
results = serializers.SerializerMethodField()
def get_results(self, obj):
results = Result.objects.filter(id__in=obj.result_set)
return ResultSerializer(results, many=True).data
关于python - 将自定义查询集传递给 Django Rest Framework 中的序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306875/