Django не возвращает набор запросов, несмотря на использование get, filter и all

#django #filter #django-queryset

#django #Фильтр #django-queryset

Вопрос:

Пожалуйста, я новичок, и я пытаюсь создать систему управления больницей.Я хочу отобразить профиль пациента, однако он возвращает только первое имя в моем наборе запросов. Мне нужно, чтобы отображались все данные, сохраненные в моей базе данных.Я пробовал filter, get и все.Они возвращают только первое имя, как определено в моем методе str.

Число просмотров

 def ProfileView(request):
    profile = Patient.objects.filter(email=request.user.email)
    return render(request,'profile.html',{'profile':profile})
 

Модели

класс Patient(модели.Модель):

 first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
email= models.EmailField(unique=True)
phone_number = models.CharField(max_length=11)
address = models.CharField(max_length=255)

def __str__(self):
    return self.first_name
 

Profile.html

 {%extends 'base.html'%}
{%load static%}
{%block content%}
<div class="container">
  {{profile}}
</div>
{%endblock content%}
 

Результат, отображаемый в html

 <QuerySet [<Patient: Kehinde>]>
 

Комментарии:

1. вам нужно перебирать результаты, если вы хотите всегда получать только один результат, используя .get(), а не .filter() docs.djangoproject.com/en/3.1/intro/tutorial03 /…

Ответ №1:

Вероятно, вам нужны взаимно однозначные отношения между профилем и пользователем вместо выполнения поиска по электронной почте

Кроме этого .filter() возвращает QuerySet while .get() возвращает экземпляр, поэтому вам следует перебирать результаты с .filter()

 def ProfileView(request):
    profiles = Patient.objects.filter(email=request.user.email)
    return render(request, 'profile.html', {'profiles':profiles})


{%extends 'base.html'%}
{%load static%}
{%block content%}
<div class="container">
{% for profile in profiles %}
  {{profile.first_name}}
  {{profile.last_name}}
{% endfor %}
</div>
{%endblock content%}
 

Вы могли бы использовать .get() , если в качестве результата ожидаете только один объект

 def ProfileView(request):
    profile = Patient.objects.get(email=request.user.email)
    return render(request, 'profile.html', {'profile':profile})
 

Комментарии:

1. Прошу прощения. Но почему мой {{profile. first_name}} не работает?

Ответ №2:

В вашем html:

{{profile}}

отображает profile.str, потому что он доступен для чтения человеком экземпляра.

если вам нужно имя пациента: {{ profile.first_name }}

Комментарии:

1. Я пробовал, это не сработало. Спасибо. Вы только что открыли мне глаза на другие возможности