В моделях django, как добавить ограничение, которое просматривает несколько строк
В приведенной ниже модели я определяю пользователя, привычку, которую пробует пользователь, дату начала (обязательно) и дату окончания (если привычка закончилась). Я хочу добавить ограничение, согласно которому каждый пользователь может быть активен только в одной привычке одновременно. Концептуально существует несколько способов определить это: Для конкретного пользователя только одна привычка имеет дату окончания NULL или для конкретного пользователя диапазон начало-конец не пересекается ни для одной из его привычек и т.д. Я не уверен, как подойти к написанию этого ограничения, поскольку оно рассматривает несколько строк, а не проверяет валидность в одной строке. Любая помощь в начале работы будет принята с благодарностью.
from django.db import models
from django.contrib.auth.models import User
from django.db.models import F, Q
class HabitChoices(models.TextChoices):
NUTRITION = 'nutrition', 'Nutrition'
EXERCISE = 'exercise', 'Exercise'
SLEEP = 'sleep', 'Sleep'
STRESS = 'stress', 'Stress'
ALCOHOL = 'alcohol', 'Alcohol'
SMOKING = 'smoking', 'Smoking'
class HabitStatus(models.Model):
""" This model keeps track, at a high level, of which habit the user is currently in.
"""
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
habit_name = models.CharField(max_length=10, choices=HabitChoices.choices, default=HabitChoices.NUTRITION)
start_date = models.DateField()
end_date = models.DateField(null=True, blank=True)
def is_current_habit(self):
if self.end_date == None:
return True
else:
return False
class Meta:
constraints = [
models.CheckConstraint(
check=Q(start_date_lte=F('end'), start_date_gte=Now),
name='correct_datetime'
)
]