【问题标题】:Django: Exclude field if select_related() gets usedDjango:如果使用 select_related() 则排除字段
【发布时间】: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


【解决方案1】:

您应该在Meta 中定义base_manager_name

use_for_related_fields = Truedeprecated with 1.10removed in 2.0

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

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2019-07-21
    • 2016-06-02
    • 2013-12-03
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多