无法访问Django中的外键

时间:2019-02-07 10:01:08

标签: django model

我有以下模板:

{% extends "artdb/base.html" %}

{% block content1 %}
<h4>Persons:</h4>
    <ul>
    {% for p in ans %}
    <h5>First name: {{p.firstName}}</h5>
    <h5>Last name: {{p.lastName}}</h5>
    <h5>Phone: {{p.phoneNumber}}</h5>
    <h5>Adress: {{p.streetAdress}}</h5>
    <h5>Zip Code: {{p.zipcode}}</h5>
    <h5>City: {{p.city}}</h5>
    <hr>
        {% endfor %}
    </ul>
{% endblock content1 %}

{% block content2 %}
<h4>Roles:</h4>
    <ul>
    {% for p in ans %}
    <h5>Role:{{p.persons.role}}</h5>
    <hr>
        {% endfor %}
    </ul>
{% endblock content2 %}

和模型:

class Person(models.Model):

    mail=models.EmailField()
    firstName=models.CharField(max_length=200)
    lastName=models.CharField(max_length=200)
    phoneNumber=PhoneNumberField()
    streetAdress=models.CharField(max_length=200)
    zipcode=models.CharField(max_length=200)
    city=models.CharField(max_length=200,default="Göteborg")
    country=models.CharField(max_length=200,default="Sweden")

    def __str__(self):
        return "%s %s" % (self.firstName,self.lastName)

    class Meta:
        ordering = ('firstName','lastName')

class Role(models.Model):

    role=models.CharField(max_length=200)
    person=models.ManyToManyField(Person)

    def __str__(self):
        return self.role

    class Meta:
        ordering = ('role',)

但是当我运行上面的代码时,我得到的唯一输出是来自块content1,即我无法访问角色内容。我以为role.persons.role可以做到,但apperantley不会。角色和角色之间存在多对多关系。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这应该有效

{% block content2 %}
    <h4>Roles:</h4>
    <ul>
        {% for p in ans %}
           {% for role in p.role_set.all %}
               <h5>Role:{{ role }}</h5>
               <hr>
           {% endfor %}
        {% endfor %}
    </ul>
{% endblock content2 %}

我们必须创建第二个for循环,因为多对多关系将始终返回列表。没有一个实例。因此,从本质上讲,这就像访问2d数组。

在Django中,您只需要在一端定义n:n关系。然后,Django也会自动将其添加到其他模型中。它通过获取相关的模型名称并加后缀_set来实现。因此,如果我们要引用与一个人相关的所有角色,则将为person.role_set。另一种解决方法是像在模型中定义的role.person