Для целей демонстрации и упрощения у меня есть модель Резервирование, которая ссылается на несколько Объекты Guest через внешний ключ. Чтобы бронирование было действительным и было сохранено, все гости, связанные с ним, должны быть не моложе 18 лет, и один и тот же гость не может отображаться в двух или более бронированиях (проверка, объединяющая данные родительской и дочерней модели, – это моя задача). основная проблема).
Однако ни одна из этих записей (ни бронь, ни гости) еще не сохранена в базе данных. Мне нужно выполнить эту проверку эффективно и чисто, желательно таким образом, чтобы логика проверки была отделена от самих моделей.
Как мне подойти к этому сценарию проверки? Каковы наилучшие методы проверки несохраненных связей внешних ключей в Django?
Вот упрощенная версия моей настройки:
Файл: models.py
Код: Выделить всё
from django.db import models
class Reservation(models.Model):
check_in_date = models.DateField()
check_out_date = models.DateField()
def __str__(self):
return f"Reservation from {self.check_in_date} to {self.check_out_date}"
class Guest(models.Model):
name = models.CharField(max_length=255)
age = models.PositiveIntegerField()
reservation = models.ForeignKey(
Reservation,
related_name="guests",
on_delete=models.CASCADE
)
def __str__(self):
return f"{self.name} ({self. Age} years old)"
Код: Выделить всё
from django.core.exceptions import ValidationError
def validate_reservation_and_guests(reservation):
"""
Validate that all guests in the reservation are at least 18 years old.
"""
for guest in reservation.guests.all():
if guest.age < 18:
raise ValidationError("All guests must be at least 18 years old.")
def validate_guest_bookings(reservation):
"""
Validate that no guest in the reservation is already booked for the same period.
"""
for guest in reservation.guests.all():
overlapping_reservations = Reservation.objects.filter(
Q(guests=guest) &
(
Q(check_in_date__lte=reservation.check_out_date) &
Q(check_out_date__gte=reservation.check_in_date)
)
).exclude(id=reservation.id) # Exclude the current reservation if updating
if overlapping_reservations.exists():
raise ValidationError(
f"Guest '{guest.name}' is already booked for a reservation in the period "
f"from {reservation.check_in_date} to {reservation.check_out_date}."
)
Как лучше всего структурировать такую проверку в администраторе Django? Я открыт для использования пользовательских методов модели, проверки формы или сигналов, но предпочитаю хранить логику в отдельном файле для лучшей организации. Существуют ли другие подходы, которые мне следует рассмотреть?
Будем очень признательны за любые примеры или советы!
Подробнее здесь: https://stackoverflow.com/questions/792 ... ving-any-r