【问题标题】:Pass a custom queryset to serializer in Django Rest Framework将自定义查询集传递给 Django Rest Framework 中的序列化程序
【发布时间】:2015-09-27 04:51:10
【问题描述】:

我正在使用 Django 休息框架 2.3 我有这样的课

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 的源代码(至少在我的版本中)它不接受查询集参数。

寻找一些指导,看看这是否可能......谢谢!

【问题讨论】:

  • 这令人困惑。 QuizSerializer 的“result_set”仍应包含所有结果,因为未在相关对象上调用 filter()。您可以从您的视图代码中添加查询吗?

标签: python django django-rest-framework


【解决方案1】:

在我看来,像这样修改过滤器并不是一个很好的做法。当我无法在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多