通过在Django一个多对多关系访问外键

问题描述 投票:0回答:1

我有一个外键又一个许多像下面的许多关系:

人<-M2M->角色(多对一) - >名称

该模型:

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):

我可以从个人和角色访问manyTomanyfield,但我不能访问名字。

模板:

{% 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 %

我知道,我必须重复,以获得多对多的,但它是与一对多一样的吗?我怎么通过角色的访问名称来源的人?

}

django foreign-keys many-to-many
1个回答
0
投票

这里是为那些有兴趣的解决方案。 (感谢丹尼尔·罗斯曼)。通过各种关系进行迭代。在这里,首先关系是多对多和第二多对一:

{% 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 %}
© www.soinside.com 2019 - 2024. All rights reserved.