Как проверить модели Django с отношениями внешнего ключа перед сохранением каких-либо записей?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как проверить модели Django с отношениями внешнего ключа перед сохранением каких-либо записей?

Сообщение Anonymous »

Я работаю над проектом Django, в котором мне нужно проверить модель перед ее сохранением на основе значений в связанных с ней моделях. Я столкнулся с этой проблемой при извлечении приложения из проекта с использованием старой версии Django (3.1) в отдельный проект Django 5.1, затем возникла ошибка «ValueError: экземпляр 'Model...' должен иметь значение первичного ключа до этого. связь может быть использована», созданная для всех классов проверки, которые использовали связанные данные модели.
Для целей демонстрации и упрощения у меня есть модель Резервирование, которая ссылается на несколько Объекты 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)"

Файл: validation.py

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»