python - 将自定义查询集传递给 Django Rest Framework 中的序列化程序

标签 python django django-rest-framework

我正在使用 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/

相关文章:

python - 在 Django API View 中创建自定义搜索过滤器

javascript - Django 静态文件没有更新

python - django.core.exceptions.ImproperlyConfigured : Cannot import 'category' . 检查 'api.category.apps.CategoryConfig.name'是否正确

Django REST Framework 获取AuthToken 用户登录API View

python - 优化 djangos count() 方法

python - 如何正确记录查询参数(搜索,过滤)Django Rest Framework?

python - 导入错误 : DLL load failed importing spacy

python - 如何从命令行使包可执行?

Python、Postgresql 从 csv 复制时遇到问题

django - 如何使用 XHR 通过 POST 将数据作为键值对而不是字符串发送