2016-06-21 93 views
0

我是Django的新手,我試圖在相關視圖中打印相關模型。我很確定數據庫本身的設置是否正確,包括密鑰等,表中有數據可供使用。我不確定的是如何遍歷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 %} 

最終結果是選民姓名列表,沒有電話號碼。我錯過了什麼?

編輯:我創建了一個本地數據庫,生成並運行django遷移,並插入一些虛擬數據。我仍然沒有電話號碼。

回答

0

如果您不使用Django創建數據庫,則需要爲VoterPhone類指定表名。 Django不會選擇選舉電話表作爲中間表。我想通過設置 class Meta: db_table ='voterphones' 對於VoterPhone類,您應該可以看到相關的電話號碼。

+0

我將在模板中使用什麼語法來遍歷這些電話? – whiterook6

+0

你的模板看起來很好,不需要改變它。 –

+0

我沒有意外複製和粘貼元塊,但它在那裏。我從模板本身收到一個錯誤消息,說'ManyToManyField'對象在模板的行中沒有屬性'_m2m_reverse_name_cache',在voter.phones.all中爲手機。 – whiterook6

0

我終於得到了一些工作。我不得不作出以下修改:

  • 得到了表重命名爲它們的默認Django的名稱(即voters_phones代替voter_phones)

  • 發現voters_phones外鍵是INT(11),而在選民和手機的主鍵是BIGINT(20)

  • 取出加入模型

感謝ÿ我們的幫助,夥計們。