Может ли кто-нибудь помочь мне оптимизировать мои запросы/структуру проекта Django?
Я создал новый проект Django, и он работает нормально, но я уверен, что есть лучший способ сделать следующее и решил спросить.
Итак, моя основная проблема заключается в шаблоне, где я должен вызвать один и тот же цикл for дважды. Один раз, чтобы включить клинику из url, как вы можете видеть на urls.py, а другой раз, чтобы показать остальные клиники, которые доступны в тот же день.
urls.py
path('onhold-hospitals/<slug:region_slug>/<slug:clinic_slug>/results/<yyyy:date>/', views.onhold_hospital_results, name='date-clinics-view-results')
Я использую это утверждение в шаблоне:
{% for hospital in available_hospitals %}
{% if hospital.onhold_date|date == default_date|date and hospital.clinic == clinic%}
<h5>Name: {{ hospital.hospital}} - Name: {{ hospital.onhold_date}} - Clinic: {{ hospital.clinic}}</h5>
{% endif %}
{% if hospital.onhold_date|date == default_date|date and hospital.clinic != clinic%}
<p>Other clinics available on the same day:
{% for hospital in available_hospitals %}
{{hospital.clinic}}
{% endfor %}
{% endif %}
{% endfor %}
Вот моя основная модель:
class Schedule(models.Model):
onhold_hour = models.CharField(max_length=50, blank=True, null=True)
onhold_date = models.DateField(default=date.today)
region = models.ForeignKey(Region, on_delete=models.CASCADE, null=True, related_name="area")
hospital = models.ForeignKey(Hospital, on_delete=models.CASCADE, null=True, related_name="available_hospital")
clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE, null=True, related_name="clinic_type")
все это возвращается из следующего файла views.py:
def onhold_hospital_results(request, region_slug, clinic_slug, **date_filters):
clinic = Clinic.objects.get(slug=clinic_slug)
region = Region.objects.get(slug=region_slug)
get_clinics_id = Clinic.objects.get(slug = clinic_slug).id
get_region_id = Region.objects.get(slug = region_slug).id
default_date = today
recent_dates = Schedule.objects.order_by('onhold_date').distinct('onhold_date').filter(onhold_date__range = (today, date_range), region = get_region_id)
date_filters = recent_dates
available_hospitals = Schedule.objects.filter(region = get_region_id, onhold_date=date)
return render(request, 'hospitals_core/onhold_hospital_results.html', {
'available_hospitals': available_hospitals,
'region': region,
'clinic': clinic,
'date_filters': date_filters,
'region_slug': region_slug,
'default_date': default_date,
'clinic_slug': clinic_slug
})
Вы должны фильтровать в представлении, а не в шаблоне, и с помощью .select_related(…) [Django-doc] вы можете получить связанные больницы:
def onhold_hospital_results(request, region_slug, clinic_slug, **date_filters):
clinic = Clinic.objects.get(slug=clinic_slug)
region = Region.objects.get(slug=region_slug)
default_date = today
recent_dates = Schedule.objects.order_by('onhold_date').distinct('onhold_date').filter(onhold_date__range = (today, date_range), region=region)
date_filters = recent_dates
available_hospitals = Schedule.objects.filter(
region=region, onhold_date=default_date
).select_related('clinic', 'hospital')
return render(request, 'hospitals_core/onhold_hospital_results.html', {
'available_hospitals': available_hospitals,
'region': region,
'clinic': clinic,
'date_filters': date_filters,
'region_slug': region_slug,
'default_date': default_date,
'clinic_slug': clinic_slug
})
Вложенный цикл {% for hospital in available_hospitals %} также не имеет особого смысла: внешний цикл уже перечисляет больницы.