2016-06-21 4 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は中間テーブルとしてvoterphonesテーブルを選択しませんでした。私は クラスをMeta: db_table = 'voterphones' VoterPhoneクラスに設定すると、関連する電話番号を確認できるはずです。

+0

テンプレートでこれらの電話機を反復処理する構文は何ですか? – whiterook6

+0

あなたのテンプレートは正常に見える、それを変更する必要はありません。 –

+0

私は偶然にメタブロックをコピー&ペーストしませんでしたが、そこにあります。 'ManyToManyField'オブジェクトにvoter.phones.allの電話機用テンプレートの行に '_m2m_reverse_name_cache'属性がないというテンプレート自体からエラーが発生しました。 – whiterook6

0

私はついに何かを得ました。私は、次の変更をしなければならなかった:

  • の表は、デフォルトのDjangoの名前に改名ました(すなわち、代わりにvoter_phonesのvoters_phones)

  • はvoters_phonesの外部キーがint(11)だったことが判明しながら、有権者と電話の両方での主キーはBIGINT(20)

  • が参加したモデルにyの

感謝を取り除きました私たちの助け、みんな。

関連する問題