Получение значения поля, связанного внешним ключом с профилем, который расширяет пользователя (отношение oneToOne) в Django views.py

Что я хочу сделать :

Отображение телефонной книги из модели Django User, расширенной моделью Profile, связанной с несколькими моделями

Что я сделал :

Конечно, я читал документацию Django (4.1)

  • У меня есть моя классическая модель Django User model

    .
  • Я создал модель "Профиль" для расширения модели Пользователя через отношения OneToOne (здесь упрощенно) :

class Profile(models.Model):
        
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    entity = models.ForeignKey(Entity, null=True, blank=True, on_delete=models.CASCADE) 


    class Meta:
        ordering = ['entity__name', 'user__last_name']

    def __str__(self):
        return self.user.first_name + " " + self.user.last_name
        
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()
  • Я создал модель "Entity" (более или менее компания, в которой работают люди) (здесь упрощенно) :
class Entity(CommonFieldsUUID):

    name = models.CharField(max_length=100, unique=True, null=False, default="N.C.")
    alias = models.CharField(max_length=25, unique=True, null=False, default="N.C.")
    
    class Meta:
        verbose_name = "Entity"
        verbose_name_plural = "Entities"

    def __str__(self):
        return self.alias
  • Вот мой views.py :
from .models import User
from django.http import HttpResponse
from django.template import loader


def phonebook(request):
    user = User.objects.filter(is_active=True).values('first_name','last_name','email','profile__entity','profile__pro_ext','profile__pro_gsm','profile__pro_trigram','profile__location')
    
    template = loader.get_template('phonebook/phonebook.html')
    context = {
        'colHeaders': ['Firstname LASTNAME',
                       'Entity',
                       'Extension',
                       'Mobile',
                       'Email',
                       'Initials',
                       'Location'],
        'user': user,
    }
    return HttpResponse(template.render(context, request))
  • Вот мой шаблон phonebook.html :
{% extends "main/datatables.html" %}

<!-- TABLE TITLE -->
{% block tableTitle %}Phonebook{% endblock %}

<!-- TABLE HEADER -->
{% block tableHeader %}
    {% if colHeaders %}
        {% for header in colHeaders %}
            <th>{{header}}</th>
        {% endfor %}
    {% else %}
        <p>No results</p>
    {% endif %}
{% endblock %}

<!-- TABLE BODY -->
{% block tableBody %}
    {% if user %}
        {% for person in user %}
        <tr>
            <td>{{person.first_name}} {{person.last_name}}</td>
            <td>{{person.profile__entity}}</td>
            <td>{{person.profile__pro_ext}}</td>
            <td>{{person.profile__pro_gsm}}</td>
            <td>{{person.email}}</td>
            <td>{{person.profile__pro_trigram}}</td>
            <td>{{person.profile__location}}</td>
        </tr>  
        {% endfor %}
    {% else %}
        <p>Pas de données.</p>
    {% endif %}
{% endblock %}

<!-- TABLE FOOTER -->
{% block tableFooter %}
    {% if colHeaders %}
        {% for header in colHeaders %}
            <th>{{header}}</th>
        {% endfor %}
    {% else %}
        <p>No results</p>
    {% endif %}
{% endblock %}

Проблема :

{{person.profile__entity}}

возвращает id сущности, но я пытаюсь отобразить имя или псевдоним модели сущности...

Что я пробовал :

  1. Читаю Django doc: но поскольку я не уверен в используемых методах, я, вероятно, не могу найти нужный раздел

    .
  2. Тупые вещи и рискованные действия в views.py и шаблонах типа :

    1. {{person.profile__entity_name}}
      
    2. {{person.profile__entity.name}}
      
    3. {{person.profile__entity_entity__name}}
      
  3. Используя подход, подобный DRF :

    entity = serializers.SlugRelatedField(
            many=False,
            read_only=True,
            slug_field='entity'
        )
    
  4. Пробовал что-то вроде этого : https://docs.djangoproject.com/en/4.1/topics/serialization/ но думаю, что я, вероятно, пропустил некоторые шаги, если это правильный способ сделать это.

  5. Читайте сообщения о проблемах, которые похожи на мои :

    1. Как получить доступ к полю от расширенного пользователя в Django?

    2. Обратный запрос на профиль расширенного пользователя django

    3. ...

При использовании values() поиск foreignKey возвращает только id объекта, а не сам объект. Добавьте profile__entity__name к вашему набору запросов в представлениях, чтобы получить имя объекта.

Вернуться на верх