【发布时间】:2019-03-09 21:41:38
【问题描述】:
我有一个这样的 Job 和 Blob 模型:
class Job(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
start_time = models.DateTimeField()
input = models.ForeignKey('Blob')
class DeferContentManager(models.Manager):
use_for_related_fields = True
def get_queryset(self, *args, **kwargs):
return super(DeferContentManager, self).get_queryset(*args, **kwargs).defer('content')
class Blob(models.Model):
content = models.BinaryField()
name = models.CharField(max_length=10000, default='')
objects = DeferContentManager()
不幸的是,有一个 Django ORM 查询可以做到这一点:
Job.objects.filter(....).select_related()
这会加载作业的 BinaryFields,我们会得到一个 MemoryError。
如果我像上面那样执行 select_related() 查询,有没有办法排除 BinaryField content?
PS:我知道我可以更改查询并使用select_related('non_binary_field'),但这里需要一个通用的解决方案。我无权访问调用此行的代码:Job.objects.filter(....).select_related()
【问题讨论】:
-
能否覆盖 DeferContentManager 中的 select_related 方法?因此您无法访问的代码部分保持不变,但 select_related 行为不同
-
或者覆盖
Job的默认查询集,这样你就可以覆盖它的select_related方法。
标签: django django-select-related