Невозможно отобразить объект, связанный с внешним ключом, в Django DetailView

У меня есть класс бронирования, который связан с моделями Customer и Barber. Я могу отобразить все бронирования, используя детальное представление, однако, не могу понять, как отобразить бронирование/бронирования, которые есть у конкретного парикмахера. По сути, я хочу получить бронирование или несколько бронирований парикмахера на основе ID, заданного в url.

Вот моя модель:

    customer_id = models.ForeignKey(User, on_delete = models.CASCADE,)
    barber_id = models.ForeignKey(Barber, on_delete = models.CASCADE)
    timeslot = models.DateTimeField('appointment')

    def __str__(self):
        return f"{self.customer_id} {self.barber_id} {self.timeslot}"
    
    def get_absolute_url(self):
        return reverse("model_detail", kwargs={"pk": self.pk})

Мое мнение:

class GetBarberBooking(DetailView):
   model = Booking
   template_name = "barber_booking.html"

   def get_context_data(self, **kwargs):
       context = super().get_context_data(**kwargs)
       context['barber'] = Booking.objects.filter(
           id=self.kwargs.get('<str:pk'))
       return context 

Мой путь к url:

path('barber-booking/<str:pk>/', views.GetBarberBooking.as_view(), name='barber-booking'),

Вы можете удалить этот кусок кода:

context['barber'] = Booking.objects.filter(
           id=self.kwargs.get('<str:pk'))

А в шаблоне просто используйте:

{{ object.barber_id }}

И показать все бронирования для парикмахера:

{{ object.barber_id.booking_set.all }}

В результате будут показаны все парикмахеры. Это работает благодаря FK-отношению между моделями Booking и Barber. Более подробную информацию можно найти в документации Django. Для обратного отношения (многие к одному), пожалуйста, ознакомьтесь с этой документацией.

К вашему сведению, вам не нужно создавать суффикс имени поля с _id, потому что Django создает его автоматически за вас.

Также, если вы хотите запросить Barber, то вам следует использовать Barber в качестве модели в DetailView. Затем вы можете использовать аналогичный запрос, упомянутый выше:

# view
class GetBarberBooking(DetailView):
   model = Barber

# template
{{ object.booking_set.all }}
Вернуться на верх