2016-06-21 2 views
0

Я новичок в Django, и я пытаюсь получить связанные модели печати в представлении. Я уверен, что сам DB настроен правильно, включая ключи и т. Д., И в таблице есть данные. Что я не уверен в этом?Как перечислить список связанных объектов в шаблоне django?

  • Могу ли я подключить модели к правильным названиям таблиц и столбцов?
  • Я загружаю телефоны для каждого избирателя?
  • Как перебирать отношения самостоятельно?

Я могу получить информацию о самом избирателе, но ничего не пытаюсь использовать связанные работы Phone.

Таблицы:

voters: 
    id int primary key 
    first_name varchar 

phones: 
    id int primary_key 
    phone_number varchar 

voter_phones: 
    voter_id FK 
    phone_id FK 

Модели:

from django.db import models 


class Phone(models.Model): 
    phone_number = models.CharField(max_length=255) 

    class Meta: 
     db_table = 'phones' 


class Voter(models.Model): 
    first_name = models.CharField(max_length=255) 
    phones = models.ManyToManyField('Phone', through='VoterPhone', related_name='voters', through_fields=('voter_id', 'phone_id')) 

    class Meta: 
     db_table = 'voters' 


class VoterPhone(models.Model): 
    voter = models.ForeignKey('Voter', related_name='voter_phones') 
    phone = models.ForeignKey('Phone', related_name='voter_phones') 

    class Meta: 
     db_table = 'voter_phones' 

Вид:

def results(request): 
    voters = Voter.objects.all() 
    return render(request, 'site/results.html', {'voters': voters}) 

Шаблон:

{% for voter in voters %} 
    {{ voter.first_name }} 
    {% for phone in voter.phones_set.all %} 
    {{ phone.phone_number }} 
    {% endfor %} 
{% endfor %} 

Конечным результатом является список имен избирателей и номера телефонов. Что мне не хватает?

EDIT: Я создал локальную базу данных, сгенерировал и запускал миграции django и вставил некоторые фиктивные данные. У меня по-прежнему нет телефонных номеров.

ответ

0

Если вы не используете Django для создания базы данных, вам нужно указать имя таблицы для класса VoterPhone. Django не выбирал таблицу избирателей в качестве промежуточной таблицы. Я думаю, установив класс Мета: db_table = 'voterphones' для категории VoterPhone вы должны быть в состоянии увидеть похожие номера телефонов.

+0

Какой синтаксис я использовал бы в шаблоне для итерации по этим телефонам? – whiterook6

+0

Ваш шаблон выглядит отлично, не нужно его менять. –

+0

Я не копировал и не вставлял мета-блок случайно, но он есть. Я получаю ошибку от самого шаблона, говоря, что объект «ManyToManyField» не имеет атрибута «_m2m_reverse_name_cache» в строке в шаблоне, для телефона в элементе voter.phones.all. – whiterook6

0

У меня, наконец, что-то работает. Я должен был сделать следующие изменения:

  • получил таблицы переименованы их имена Джанго по умолчанию (а именно, voters_phones вместо voter_phones)

  • обнаружил, что внешние ключи в voters_phones были INT (11), а первичные ключи в обоих избирателей и телефоны были BIGINT (20)

  • удалены Соединить моделям

Спасибо за у наша помощь, ребята.

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