2

我有一个这样的 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。

content如果我像上面那样执行 select_related() 查询,有没有办法排除 BinaryField ?

PS:我知道我可以更改查询和使用select_related('non_binary_field'),但这里需要一个通用的解决方案。我无权访问调用此行的代码:Job.objects.filter(....).select_related()

4

1 回答 1

1

你应该定义base_manager_nameMeta.

use_for_related_fields = True1.10 中已弃用在 2.0 中删除

请参阅:https ://docs.djangoproject.com/en/1.11/ref/models/options/#base-manager-name

于 2020-03-10T15:18:21.917 回答