2013-10-12 8 views
4

Я почти уверен, что здесь что-то не так, но я не могу понять это.Prefetch_related() присоединяется ко всему по первому элементу

В моем приложении, Элементы могут быть сохранены в Рабочем наборе, следующим образом:

# models.py  
class Item(models.Model): 
    name = models.CharField() 

class Workspace(models.Models): 
    name = models.CharField() 
    items = models.ManyToManyField(
     Item, 
     related_name="workspaces", 
     null=True, 
     blank=True, 
     default=None) 

Тогда в моем ListView, я хочу, чтобы отобразить элементы и связанные с ними рабочие области:

# views.py 
class ListItems(ListView): 
    model = Items 
    template_name = "list_items.html" 
    def get_queryset(self): 
     return self.model.objects.all().prefetch_related('workspaces') 

ошибка в моем шаблоне:

# list_items.html 
{% for object in object_list %} 

    {{ object.name }} 
    Workspaces : 
    {% for workspace in object.workspaces.all %} 
     {{ workspace.name }} 
    {% empty %} 
     No workspaces 
    {% endfor %} 
{% endfor %} 

Скажем, у меня есть 10 разных предметов, а одна папка под названием «F оо». Вместо отображения мой шаблон, как это:

Item1 
workspaces: Foo 

Item2 
workspaces: Foo 

Item3 
workspaces: Foo 

#etc... 

я получаю следующий результат:

Item1 
workspaces: Foo Foo Foo Foo Foo Foo Foo Foo Foo Foo # 1 Foo per item in list 

Item2 
workspaces: No workspaces 

Item3 
workspaces: No workspaces 

#etc... 

Похоже, prefetch_related() связывает все рабочие области на первый элемент в списке. Если я удаляю prefetch_related() часть get_queryset(), я получаю правильный вывод, но он требует больше запросов.

Что я здесь делаю неправильно?

Мое приложение намного сложнее, поэтому, возможно, я слишком упростил его. В частности, мой метод get_queryset() включает больше фильтров перед командой prefetch_related(). Просто скажите, нужны ли вам данные.

Благодарим за помощь!

+1

Вы проверили свой образец кода? ... Я запускаю его с Django 1.5.1, но не могу сгенерировать описанную вами проблему, получил 'item1 worspace: Foo, item2 workspace: Foo, ...', может быть, ошибка введена в строке, удаленной, когда вы упрощаете свою code – juliocesar

+0

Отправьте код, который дает вам проблему вместо упрощения. –

+0

Благодарим вас за ответ. Я дам вам больше информации в ближайшее время. Проводка всего кода будет сложной, потому что приложение является сложным (многоуровневое наследование для видов, моделей и т. Д.). Поскольку Juliocesar проверил код и не может воспроизвести проблему, он должен лежать в моей собственной логике. То, что я могу сделать, - это предоставить вам доступ к git repo (ничего личного в нем), но вам нужно будет настроить весь проект, изучить код и т. Д., Что может потребовать некоторого времени. Я был бы рад получить справку, но не чувствую себя вынужденным делать это. –

ответ

1

Я только что понял, что забыл очень важный элемент: я использую django-polymorphic для моей базовой модели. Я запустил som e тестов и без полиморфных, prefetch_related работает должным образом.

Я открыл проблему в Джанго полиморфного багтрекер: https://github.com/chrisglass/django_polymorphic/issues/68

я действительно извиниться за эту ошибку, и я прошу прощения за то терять свое время.

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