select_related问题

时间:2013-03-02 20:40:25

标签: python django django-orm

以下是我的模特:

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'

怎么了?

2 个答案:

答案 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)。