通过Django中的多方关系访问外键

时间:2019-02-07 17:32:26

标签: django foreign-keys many-to-many

我有一个外键,而外键又具有如下所示的多对多关系:

人员<-M2M->角色(ManyToOne)->姓名

模型:

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',)

class Name(models.Model):

    name=models.CharField(max_length=200)
    role=models.ForeignKey(Role,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('name',)

class Address(models.Model):

我可以从人员和角色中访问manyTomany字段,但不能访问名称。

模板:

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

{% block content1 %}
    <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 %}
    <ul>
      {% for p in ans %}
           {% for r in p.role_set.all %}
              <h5>{{ r.role }}</h5>
           {% endfor %}       
      {% endfor %}
    <hr>
    </ul>
{% endblock content2 %}

{% block content3 %}
    <ul>
      {% for p in ans %}
           {% for r in p.role_set.all %}
              <h5>{{ r.name }}</h5>
           {% endfor %}       
      {% endfor %}
    <hr>
    </ul>
{% endblock content3 %

我知道我必须迭代才能获得manyTomany,但是与oneTomany一样吗? 如何通过角色从人员中访问姓名?

}

1 个答案:

答案 0 :(得分:0)

这是那些有兴趣的人的解决方案。 (感谢Daniel Roseman)。遍历每个关系。在这里,第一个关系是多对多的,第二个关系是多对一的:

{% block content3 %}
    <ul>
      {% for p in ans %}
         {% for r in p.role_set.all %}
              {% for n in r.name_set.all %}
                 <h5>{{ n }}</h5>
              {% endfor %}      
           {% endfor %}       
      {% endfor %}
    <hr>
    </ul>
{% endblock content3 %}