python - Django 中的预取问题

标签 python django django-queryset prefetch

我的 Django 应用程序中有当前模型:

class Referentiel(models.Model):
    code = models.CharField(max_length=50)
    libelle = models.CharField(max_length=100)


class Reference(models.Model):
    referentiel = models.ForeignKey('Referentiel', related_name='reference_set')
    clef = models.CharField(max_length=50)


class ValeurReference(models.Model):
    reference = models.ForeignKey('Reference', related_name='valeur_set')
    valeur = models.DecimalField(max_digits=15, decimal_places=5)
    date_fin = models.DateField(blank=True, null=True)

我想检索 Referentiel 的值,所以我做了类似的事情:

Referentiel.objects.filter(code='whatever_code').prefetch_related(Prefetch('reference_set__valeur_set', to_attr='valeurs'))

但是在尝试获取我的值时出现以下错误:

AttributeError: 'Referentiel' object has no attribute 'valeurs'

Django 版本:1.7.4 Python版本:3.4.2

感谢您的任何建议。

最佳答案

我知道这是一个老问题,但我最近也遇到了这样的错误。

问题是 valeurs 没有分配给 Referentiel 对象,而是分配给了 reference_set

所以在这种情况下,假设您有这样的查询集:

queryset = (
    Referentiel
    .objects
    .filter(code='whatever_code')
    .prefetch_related(Prefetch('reference_set__valeur_set', to_attr='valeurs'))
)

而不是做:

queryset[0].valeurs

你必须做的:

queryset[0].reference_set.all()[0].valeurs

不幸的是,to_attr 可能具有误导性,并且文档中未提及嵌套查找的场景。

关于python - Django 中的预取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699464/

相关文章:

python - 如何处理 imaplib2 错误

python - python中的循环链表

django - 如何在 Django 中实现编辑批准队列

django - 这些参数在 swagger_auto_schema (Django) 中是什么意思?

python - Django QuerySet 对象没有属性 'objects

python - 由 numpy.linalg.eig 创建的特征向量似乎不正确

python - 调用 Django i18n makemessages 命令时出现 UnicodeError 错误

python - 如何使用模拟来测试 next_day_of_week 函数

sql-order-by - Django 在 .annotate() 中使用 order_by 并获取相关字段

django - 在 Django 中分组和排序