1

这是我的模型:

class Brand(models.Model):
    name         = models.CharField(max_length=30)
    order        = models.SmallIntegerField()

class FeatureGroup(models.Model):
    name         = models.CharField(max_length=30)

class Feature(models.Model):
    name         = models.CharField(max_length=30, blank=True)
    order        = models.SmallIntegerField()
    group        = models.ForeignKey(FeatureGroup)

class FeatureDetail(models.Model):
    description         = models.TextField()
    feature             = models.ForeignKey(Feature)

class Phone(models.Model):
    name         = models.CharField(max_length=30)
    brand        = models.ForeignKey(Brand)
    features     = models.ManyToManyField(FeatureDetail)

我试图获取当前手机的功能和功能详细信息并循环数据对但无法这样做。

我试过这个,它只适用于获得品牌:

p = get_object_or_404(Phone.objects.select_related('brand', 'feature__featuredetail'), id=id)

做的时候:

print p.featuredetail_set.all()

我得到了这个错误:

Django Version: 1.4.3
Exception Type: AttributeError
Exception Value:    
'Phone' object has no attribute 'featuredetail_set'

怎么了?

4

2 回答 2

2

您不能使用类名作为select_related. 该参数必须是您的模型字段的字符串。

在你的情况下,它应该是'features__feature'

另一个问题是select_related 不能遵循多对多关系。这就是为什么prefetch_related来。

因此,您的查询集将是:

Phone.objects.select_related('brand').prefetch_related('features__feature')

请注意,这prefetch_related会创建一个附加查询并在 Python 中加入。

于 2013-03-03T08:29:39.973 回答
1

你的关系叫features,不是featuredetail_set

请注意select_related,这与 无关,在这种情况下它什么都不做(它只适用于正向 ForeignKeys,无论如何)。

于 2013-03-02T22:16:48.730 回答