将自定义查询集传递给Django Rest Framework中的序列化器 [英] Pass a custom queryset to serializer in Django Rest Framework

查看:88
本文介绍了将自定义查询集传递给Django Rest Framework中的序列化器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Django rest framework 2.3
我有一个类似的类

I am using Django rest framework 2.3 I have a class like this

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.fil ter()仅返回将save_once设置为True的结果

As you see I have a custom manager on results so Result.objects.filter() will only return results that have save_once set to True

现在,我的序列化程序如下:

Now my Serializers look like this:

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/ 中的(更多说明部分)。但是,当我尝试此操作

Now if I serializer my quiz it would return only results that have saved_once set to True. But for a particular use case I want the serializer to return all objects. I have read that I can do that by passing a queryset parameter http://www.django-rest-framework.org/api-guide/relations/ in (further notes section). However when I try this

results = ResultSerializer(many=True, required=False, source='result_set',
                           queryset=
                               Result.objects.filter(
                               saved_once__in=[True, False]))

我得到 TypeError:__init __()得到了一个意外的关键字参数'queryset'
并查看了DRF的源代码(在我的版本中至少),它不接受queryset参数。

I get TypeError: __init__() got an unexpected keyword argument 'queryset' And looking at the source code of DRF(in my version atleast) it does not accept a queryset argument.

正在寻找有关此操作的指导,看是否有可能...谢谢!

Looking for some guidance on this to see if this is possible... thanks!

推荐答案

在我看来,像这样修改过滤器不是一个很好的做法。当我在没有进行额外过滤的情况下无法在Result模型上使用过滤器时,很难为您编写解决方案。我建议不要以这种方式修改过滤器,而是创建一个自定义管理器方法,该方法允许您以明显的方式在需要的地方应用过滤器,例如//

In my opinion, modifying filter like this is not a very good practice. It is very difficult to write a solution for you when I cannot use filter on the Result model without this extra filtering happening. I would suggest not modifying filter in this manner and instead creating a custom manager method which allows you to apply your filter in an obvious way where it is needed, eg/

class SavedOnceManager(models.Manager):                                                                                                                                                                                                
    def saved_once(self):
        return self.get_queryset().filter('saved_once'=True)

因此,您可以查询已保存的行或未过滤的行:

Therefore, you can query either the saved_once rows or the unfiltered rows as you would expect:

Results.objects.all()
Results.objects.saved_once().all()

这是在序列化程序中使用附加查询集的一种方法。但是,在我看来,如果默认管理器以某种方式过滤掉saved_once对象,那么这很可能对您不起作用。因此,您的问题出在其他地方。

Here is one way which you can use an additional queryset inside a serializer. However, it looks to me that this most likely will not work for you if the default manager is somehow filtering out the saved_once objects. Hence, your problem lies elsewhere.

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

这篇关于将自定义查询集传递给Django Rest Framework中的序列化器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆