如何遍历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类,您应该可以看到相关的电话号码。
答
我终于得到了一些工作。我不得不作出以下修改:
得到了表重命名为它们的默认Django的名称(即voters_phones代替voter_phones)
发现voters_phones外键是INT(11),而在选民和手机的主键是BIGINT(20)
取出加入模型
感谢ÿ我们的帮助,伙计们。
我将在模板中使用什么语法来遍历这些电话? – whiterook6
你的模板看起来很好,不需要改变它。 –
我没有意外复制和粘贴元块,但它在那里。我从模板本身收到一个错误消息,说'ManyToManyField'对象在模板的行中没有属性'_m2m_reverse_name_cache',在voter.phones.all中为手机。 – whiterook6