如何遍历django模板中的相关对象列表?

问题描述:

我是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迁移,并插入一些虚拟数据。我仍然没有电话号码。

如果您不使用Django创建数据库,则需要为VoterPhone类指定表名。 Django不会选择选举电话表作为中间表。我想通过设置 class Meta: db_table ='voterphones' 对于VoterPhone类,您应该可以看到相关的电话号码。

+0

我将在模板中使用什么语法来遍历这些电话? – whiterook6

+0

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

+0

我没有意外复制和粘贴元块,但它在那里。我从模板本身收到一个错误消息,说'ManyToManyField'对象在模板的行中没有属性'_m2m_reverse_name_cache',在voter.phones.all中为手机。 – whiterook6

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

  • 得到了表重命名为它们的默认Django的名称(即voters_phones代替voter_phones)

  • 发现voters_phones外键是INT(11),而在选民和手机的主键是BIGINT(20)

  • 取出加入模型

感谢ÿ我们的帮助,伙计们。