我正在简化这一过程,以使问题尽可能清晰。
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()]
是我能想到通过该方法过滤查询集的唯一方法。
答案 0 :(得分:0)
您无法使用类方法逐字过滤查询集 - 查询集过滤器在数据库级别应用,并且数据库不知道您的类方法的作用。您的示例可以使用filter(content_type__in=('image/png', 'image/jpeg', 'image/gif'))
实现,可以轻松地将其放入自定义管理器中,但如果您的实际情况对于此类查询而言过于复杂,则必须接受必须将对象加载到内存中以执行任意Python在他们身上或记录数据库可以使用的内容,例如您在上传时设置的is_image
BooleanField
。