Django中的预取问题



我的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.4Python版本: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可能会产生误导,文档中没有提到嵌套查找的场景。

我认为您已经使用queryset参数来指定预取的自定义查询,并从此处预取valeur_set。

更新:

reference_qs = Reference.objects.prefetch('valeurreference_set').all()
    Referentiel.objects.filter(code='whatever_code')
        .prefetch_related(
            Prefetch('reference_set', queryset=reference_qs, to_attr='valeurs')
        )

相关内容

  • 没有找到相关文章

最新更新