2009-11-23 1 views
0

Учитывая следующие модели, мне нужно вернуть список Ссылки для каждого Место, сгруппированных по категориям .Список, Группа нескольких экземпляров объекта на основе ManyToMany поля в Django

class Place(models.Model): 
    name = models.CharField(max_length=100) 

class Category(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.TextField() 

class Link(models.Model): 
    name = models.CharField(max_length=100) 
    url = models.URLField() 
    place = models.ManyToManyField('Place') 
    categories = models.ManyToManyField('Category') 
    description = models.TextField() 
    featured = models.BooleanField() 
    published = models.BooleanField() 
    date_added = models.DateField(auto_now_add=True) 

Результат будет выглядеть примерно так:

Некоторые Место
Информация о каком-то месте ... (не очень важный вопрос) для

Банки
Банк Америки
Коммерческий банк
Первый национальный B ANK

Финансовые услуги
Банк Америки
Edward Jones

Кредиты
Commerce Bank
Первого Национального банка

Как вы можете видеть, Link должны быть перечислены в каждом Категория, в котором он принадлежит.

Я попытался пропустить категории и объединить запросы, но с полями ManyToMany, похоже, не представляется возможным сделать необходимый вид, который можно передать в шаблон и сгруппировать там.

ответ

1

В чем проблема? Я попробовал это сам на консоли, вот трассировка, которая должна вам помочь.

 
>>> ny = Place.objects.create(name='NewYork') 
>>> bank = Category.objects.create(name='bank',description='aaa') 
>>> bofa = Link.objects.create(name='BofA',url='http://google.com',description='a') 
>>> bofa.place.add(ny) 
>>> bofa.categories.add(bank) 
>>> ny.link_set.all() 
[Link: Link object] # This is `bofa` 
>>> ny.link_set.filter(categories=bank) 
[Link: Link object] 
>>> 

В чем проблема? Для отображения всех категорий категорий, определенного места,

  • Получить объект объекта Использовать get_object_or_404. ny в приведенном выше примере
  • Получить все ссылки в наличии, отфильтровать для нужной вам категории. (Возможно, вам также необходимо будет получить список всех категорий в этом месте.)
+0

Если вы только что разместили place.link_set.all(), ссылки, которые должны отображаться в нескольких категориях, отображаются только в наборе запросов один раз вместо одного для каждой категории, в которой они перечислены. Не говоря уже о том, что сортировать ссылки по названию категории невозможно. Я думаю, что способ сделать это - использовать промежуточное поле для отношений ManyToMany. Таким образом, экземпляры каждого листинга в каждой категории могут быть восстановлены и отсортированы. – 2009-11-25 05:52:04