Как запросить отношения многие ко многим в Джанго - PullRequest
2 голосов
/ 09 сентября 2011

У меня есть список организаций, которые заполнены под различные типы организаций.У меня есть таблица с именем, телефоном и т. Д., А затем другая таблица с идентификатором, привязанным к типу организации.Затем таблица, которая содержит отношение «многие ко многим», потому что организация может иметь много разных типов организаций.

Что я хочу сделать, это перечислить все клубы в алфавитном порядке, которые подпадают под каждый тип организации.

Я не уверен, нужно ли это делать в views.py или в моем файле шаблона.

Вот мои модели:

class ClubType(models.Model):
    name = models.CharField(max_length = 250)

    def __unicode__(self):
        return self.name

class Club(models.Model):

    name = models.CharField(max_length = 250,
            verbose_name = "Club or Organization Name",
            )
    created_date = models.DateTimeField(
            auto_now_add = True,
            )
    updated_date = models.DateTimeField(
            auto_now = True,
            auto_now_add = True,
            )
    club_type = models.ManyToManyField(ClubType)
    username = models.CharField(max_length = 100,
            blank = True, null = True
            )
    contact_name = models.CharField(max_length = 250,
            blank = True, null = True,
            )
    phone_number = models.CharField(max_length = 250,
            blank = True, null = True,
            )

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ('name', )

Я новичок в Python и Django, поэтому любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

4 голосов
/ 09 сентября 2011

В основном вам необходимо выполнить следующие шаги:

  1. Получить различные типы клубов
  2. Для каждого типа клуба выберите клубы этого типа (см. Также this )
  3. Сортировка выбора из # 2 в алфавитном порядке

Есть много способов добиться этого, и я бы не рекомендовал помещать эту логику в шаблон из-за того простого факта, что выражение логики, стоящей за ней, возможно, проще в представлении (или в пользовательском менеджере если ты станешь авантюрным позже в твоей жизни в Джанго)

Пример ( предупреждение: непроверенный код):

# step 1
club_types = ClubTypes.objects.distinct()

# step 2 & #3
club_sets = []
for current_club_type in club_types:
    cset = Clubs.objects.filter(club_type__id=current_club_type.pk).order_by('name')
    club_sets.append((current_club_type, cset))

В итоге у вас останется список списков клубных типов, каждый из которых отсортирован по имени, имеющему форму:

[(clubtype1, [club1, club2, ...]), (clubtype2, [club2, club8, ...]), ...]

...