не может получить доступ к внешним ключам в Django - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть следующий шаблон:

{% 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 голосов
/ 07 февраля 2019

Это должно работать

{% 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, поскольку отношение многие ко многим всегда будет возвращать список.Ни одного экземпляра.По сути, это похоже на доступ к двумерному массиву.

В Django вам нужно только определить отношение: n на одном конце.Затем Django автоматически добавит его и в другую модель.Это делается путем взятия названия соответствующей модели и суффикса _set.Поэтому, если мы хотим сослаться на все роли, приписанные человеку, это будет person.role_set.С другой стороны это будет role.person, как вы определили в модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...