Можно ли в одном цикле вывести данные из двух моделей, принадлежащих другой модели?

Рейтинг: 0Ответов: 1Опубликовано: 03.08.2023

Есть главная модель User, я её расширил, добавил 2 модели Profile и Friends. Могу ли я в одном цикле вывести данные из Profile и Friends, принадлежащие User?

models.py:

class Sitylist(models.Model):
 idsity = models.AutoField(primary_key=True)
 sityname = models.TextField()


class Profile(models.Model):
 user = models.OneToOneField(User, on_delete=models.CASCADE)
 sitys = Sitylist.objects.all()
 INTEGER_CHOICES= [(str(thing.sityname), str(thing.sityname)) for thing, things in zip(sitys, sitys)]
 BLOOD_TYPES_CHOICES = [('В активном поиске', 'В активном поиске'),('Встречаюсь', 'Встречаюсь'),('Женат', 'Женат'),('Замужем', 'Замужем'),('Всё сложно', 'Всё сложно'),]
 sity = models.CharField('sity', max_length=30,blank=True,choices=INTEGER_CHOICES)
 birth_date = models.DateField(null=True, blank=True)
 osebe = models.TextField(max_length=300, blank=True)
 blood_type = models.CharField('Blood Type', max_length=40,blank=True,choices=BLOOD_TYPES_CHOICES)

class Friends(models.Model):
 to_user = models.ForeignKey(User, models.CASCADE, related_name='friends',unique=False) # для пользователя
 ot_user = models.ForeignKey(User, models.CASCADE, related_name='_unused_friend_relation',unique=False) # от  пользователя
 class Meta:
     unique_together = ('to_user', 'ot_user',)

views.py:

def friends(request):
if request.user.is_authenticated:
    if request.method == 'POST':
        pass
    else:
        friends_list = Friends.objects.filter(to_user=request.user.id)
        return render(request, 'board/friends.html', {'friends_list':friends_list})
else:
    return redirect('login')

friends.html:

{% extends "board/base.html" %}
{% load static %}
{% block content %}
<div>
    {% if user.is_authenticated %}
    <div>
        {% for friends in friends_list %}
            <p>{{ friends.ot_user.first_name }} {{ friends.ot_user.last_name }}</p>
            <p>{{ friends.user.sity }}</p> <!--не могу вывести поля из модели Profile--> 
            <p>{{ friends.user.osebe }}</p><!--принадлежащие User -->
        {% endfor %}
    </div>
    {% endif %}
</div>
{% endblock %}

У меня выводит только вот эти 2 поля:

{{ friends.ot_user.first_name }} {{ friends.ot_user.last_name }}

из модели Друзья, а к модели Profile нету доступа, хотя эти 2 модели привязаны к User.

Могу ли я как-то в цикле вывести каждого друга с всеми полями Profile (osebe sity)? Я запутался в выводе данных.

я изменил код во views.py теперь в консоли выводятся все нужные данные имя фамилия город я не могу разобрать как переменную friends_profil из цикла for объединить в 1 QuerySet

def friends(request):
if request.user.is_authenticated:
    if request.method == 'POST':
        pass
    else:
        obj_user = Friends.objects.filter(to_user=request.user.id)
        for list_user_friends in obj_user:
            obj_profil = Profile.objects.get(user=list_user_friends.ot_user.id)
            friends_profil = (obj_profil.user.last_name,obj_profil.user.first_name,obj_profil.sity)
        return render(request, 'board/friends.html', {})
else:
    return redirect('login')

это вывод из консоли

print(type(obj_profil))
<class 'board.models.Profile'>
<class 'board.models.Profile'>
<class 'board.models.Profile'>
<class 'board.models.Profile'>

Ответы

▲ 0

Вот решение views.py

def friends(request):
if request.user.is_authenticated:
    if request.method == 'POST':
        pass
    else:
        obj_list_user = []
        obj_user = Friends.objects.filter(to_user=request.user.id)
        for list_user_friends in obj_user:
            obj_profil = Profile.objects.get(user=list_user_friends.ot_user.id)
            #print(obj_profil.user.last_name,obj_profil.user.first_name,obj_profil.sity)
            obj_list_user.append(obj_profil)
        return render(request, 'board/friends.html', {'obj_list_user':obj_list_user})
else:
    return redirect('login')

шаблон.html

{% extends "board/base.html" %}
{% load static %}
{% block content %}
<div>
    {% if user.is_authenticated %}
    <div>
        <ul class="list-group">
            {% for obj_user in obj_list_user %}
                <li class="list-group-item">{{ obj_user.sity }} {{ obj_user.user.last_name }} {{ obj_user.user.first_name }}</li>
            {% endfor %}
        </ul>
    </div>
    {% endif %}
</div>

{% endblock %}