如何返回由django 1.5中的类方法过滤的查询集

时间:2014-08-21 22:51:30

标签: django methods filter django-queryset

我正在简化这一过程,以使问题尽可能清晰。

    class UploadedFile(model.Model)
        #actually inherits from a superclass s3file but not relevant

        objects = model.Manager

        def is_image(self):
            return self.content_type in ['image/png', 'image/jpeg', 'image/gif']

我想要的是能够使用自定义管理器使用类似UploadedFile.objects.filter(is_image=True)UploadedFile.objects.images.filter(...)的过滤器查询上传的文件。

我知道我可以创建一个UploadedFileManager,但我不知道如何执行此操作以便它返回一个queryset对象而不是一个列表。我死了,因为列表推导[x for x in all_uploads if x.is_image()]是我能想到通过该方法过滤查询集的唯一方法。

1 个答案:

答案 0 :(得分:0)

您无法使用类方法逐字过滤查询集 - 查询集过滤器在数据库级别应用,并且数据库不知道您的类方法的作用。您的示例可以使用filter(content_type__in=('image/png', 'image/jpeg', 'image/gif'))实现,可以轻松地将其放入自定义管理器中,但如果您的实际情况对于此类查询而言过于复杂,则必须接受必须将对象加载到内存中以执行任意Python在他们身上或记录数据库可以使用的内容,例如您在上传时设置的is_image BooleanField