2013-03-02 3 views
0

Вот мои модели:select_related Выпуска

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

Вы не можете использовать имя класса в качестве параметра для select_related. Параметр должен быть строкой вашего поля модели.

В вашем случае, это должно быть 'features__feature'

Другая проблема заключается в том, что select_relatedне может следовать многие ко-многим. Вот почему приходит prefetch_related.

Таким образом, ваш QuerySet будет:

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

Обратите внимание, что prefetch_related создает дополнительный запрос и делает присоединение в Python.

1

Ваше отношение называется features, а не featuredetail_set.

Обратите внимание, что это не имеет никакого отношения к select_related, который в этом случае ничего не делает (он работает только в ForwardKeyKeys).

Смежные вопросы