29

我想知道 Django 中是否有一种方法可以判断一个相关字段,特别是一对多关系的“多”部分,是否已经通过,比如说,prefetch_related()没有实际获取它来获取?

所以,作为一个例子,假设我有这些模型:

class Question(Model):
  """Class that represents a question."""

class Answer(Model):
  """Class the represents an answer to a question."""
  question = ForeignKey('Question', related_name='answers')

通常,要获得问题答案的数量,获得答案的最有效方法是执行以下操作(因为count()如果您只需要计数,Django 文档状态会更有效):

# Note: "question" is an instance of class Question.
answer_count = question.answers.count()

然而,在某些情况下,答案可能是通过prefetch_related()调用(或某种方式,例如之前迭代过答案)获取的。所以在这种情况下,这样做会更有效率(因为我们会跳过额外的计数查询):

# Answers were fetched via prefetch_related()
answer_count = len(question.answers.all())

所以我真正想做的是:

if question.answers_have_been_prefetched:  # Does this exist?
  answer_count = len(question.answers.all())
else:
  answer_count = question.answers.count()

如果重要的话,我正在使用 Django 1.4。提前致谢。

编辑:添加了说明,这prefetch_related()不是获取答案的唯一方法。

4

1 回答 1

34

是的,Django 将预取的结果存储在_prefetched_objects_cache父模型实例的属性中。

因此,您可以执行以下操作:

instance = Parent.objects.prefetch_related('children').all()[0]

try:
    instance._prefetched_objects_cache[instance.children.prefetch_cache_name]
    # Ok, it's pefetched
    child_count = len(instance.children.all())
except (AttributeError, KeyError):
    # Not prefetched
    child_count = instance.children.count()

请参阅django 源主干中的相关使用或v1.4.9中的等效项

于 2013-10-29T07:10:12.787 回答