以下是我的模特:
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'
怎么了?
答案 0 :(得分:2)
您不能将类名用作select_related
的参数。参数必须是模型字段的字符串。
在您的情况下,它应该是'features__feature'
另一个问题是select_related
无法遵循多对多关系。这就是prefetch_related
来的原因。
因此,您的查询集将是:
Phone.objects.select_related('brand').prefetch_related('features__feature')
请注意prefetch_related
会创建一个额外的查询并在Python中加入。
答案 1 :(得分:1)
您的关系称为features
,而不是featuredetail_set
。
请注意,这与select_related
无关,{{1}}在这种情况下什么都不做(它只适用于前进的ForeignKeys)。