Django. Почему мой внешний ключ не соответствует тем же данным из родительского первичного ключа - PullRequest
0 голосов
/ 06 мая 2020

У меня 2 модели:

class Director(models.Model):
    director_name = models.TextField(primary_key=True)
    director_firstname = models.CharField(max_length=32)

    def __str__(self):
        return f'{self.director_name}'

    def get_absolute_url(self):
        return reverse('director-detail', args=[str(self.director_name)])

    class Meta:
        managed = False
        db_table = 'director'
        ordering = ['director_name']

class Connection(models.Model):
    director_connect = models.ForeignKey('Director', models.DO_NOTHING, db_column='director_connect')
    worker_connect = models.ForeignKey('Worker', models.DO_NOTHING, db_column='worker_connect')

    class Meta:
        managed = False
        db_table = 'connection'
        unique_together = (('director_connect', 'worker_connect'),)
        ordering = ['director_connect']

    def __str__(self):
        return f'{self.director_connect}'

    def get_absolute_url(self):
        return reverse('director-detail', args=[str(self.director_connect)])

Это мой файл view.py:

class DirectorDetailView(generic.DetailView):
    model=Director
    template_name = 'company/director_detail.html'

    def get_context_data(self, **qwargs):
        a = super(DirectorDetailView, self).get_context_data(**qwargs)
        a['cons'] = Connection.objects.all()
        return a

Когда я пытаюсь сопоставить 2 столбца в html с for l oop и оператор if, они не совпадают, хотя они похожи друг на друга, копии друг друга:

{% extends "index.html" %}
{% block content %}
    <h1>{{ director.director_name }}</h1>
    <p>{{ director.firstname }}</p>
    {% for con in cons %}
        {% if object.director_name == con.director_connect %}
            <li>{{con.id}}, {{con.director_connect}}, {{con.worker_connect}}</li>
        {% endif %}
    {% endfor %}
{% endblock %}

Как я могу это исправить? Хочу привести список работников на имя директора. Любая ссылка на вероятный ответ (искал, но не нашел) или небольшое значение sh в правильном направлении было бы неплохо.

1 Ответ

1 голос
/ 06 мая 2020

Проблема в том, что в вашем шаблоне вы сравниваете имя директора с первичным ключом, на который есть ссылка в Connection с помощью Director_connect ForeignKey. Самым простым решением было бы изменить выражение if:

{% extends "index.html" %}
{% block content %}
    <h1>{{ director.director_name }}</h1>
    <p>{{ director.firstname }}</p>
    {% for con in cons %}
        {% if object == con.director_connect %}  // Change it so it compares the primary key
            <li>{{con.id}}, {{con.director_connect}}, {{con.worker_connect}}</li>
        {% endif %}
    {% endfor %}
{% endblock %}

Другой способ добиться этого - отфильтровать рабочих по директору в представлении с помощью filter:

class DirectorDetailView(generic.DetailView):
    model=Director
    template_name = 'company/director_detail.html'

    def get_context_data(self, **qwargs):
        a = super(DirectorDetailView, self).get_context_data(**qwargs)
        director = self.get_object()
        a['cons'] = Connection.objets.filter(direct_connect=director).all()
        return a

This лучше, потому что он будет фильтровать рабочих в базе данных, используя SQL, что, вероятно, быстрее, чем механизм шаблонов.

Другим решением было бы использовать ManyToManyField и позволить django ORM позаботьтесь об отношениях за вас, но это потребует рефакторинга кода и, возможно, некоторых миграций базы данных.

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