Я почти уверен, что здесь что-то не так, но я не могу понять это.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(). Просто скажите, нужны ли вам данные.
Благодарим за помощь!
Вы проверили свой образец кода? ... Я запускаю его с Django 1.5.1, но не могу сгенерировать описанную вами проблему, получил 'item1 worspace: Foo, item2 workspace: Foo, ...', может быть, ошибка введена в строке, удаленной, когда вы упрощаете свою code – juliocesar
Отправьте код, который дает вам проблему вместо упрощения. –
Благодарим вас за ответ. Я дам вам больше информации в ближайшее время. Проводка всего кода будет сложной, потому что приложение является сложным (многоуровневое наследование для видов, моделей и т. Д.). Поскольку Juliocesar проверил код и не может воспроизвести проблему, он должен лежать в моей собственной логике. То, что я могу сделать, - это предоставить вам доступ к git repo (ничего личного в нем), но вам нужно будет настроить весь проект, изучить код и т. Д., Что может потребовать некоторого времени. Я был бы рад получить справку, но не чувствую себя вынужденным делать это. –