В Django определите функцию проверки, чтобы избежать перекрытия чисел
В django apps у меня есть модель для номера диапазона
В моем model.py
def valide_range(value):
all_ranges = RangeNumber.objects.all()
for a_range in all_ranges:
if a_range.start_num_int <= value <= a_range.end_num_int:
raise ValidationError('The number is in an exiting number range')
class RangeNumber(models.Model):
start_num = models.IntegerField(validators=[valide_range])
end_num = models.IntegerField(validators=[valide_range])
Эта валидация подходит для диапазона create, но не для диапазона udapte, потому что проверяется весь диапазон (редактируемый диапазон и другой), для обновления я хочу проверить только другой.
Спасибо
Вы можете использовать clean() в модели, и исключить запись, если она имеет пк (если она сохранена в db) - предупреждение непроверенного кода:
from django.db.models import Q
def clean(self):
cleaned_data = super().clean()
start_num = cleaned_data.get("start_num")
end_num = cleaned_data.get("end_num")
q = Q()
if self.pk:
Q(id=self.pk)
all_ranges = RangeNumber.objects.exclude(q)
for a_range in all_ranges:
if a_range.start_num_int <= start_num <= a_range.end_num_int:
raise ValidationError('The number is in an exiting number range')
if a_range.start_num_int <= end_num <= a_range.end_num_int:
raise ValidationError('The number is in an exiting number range')
@lorenzo Prodon
Это работает с :
def clean(self):
start_num = self.start_num if self.start_num else 0
end_num = self.end_num if self.end_num else 0
id = self.id if self.id else None
all_ranges = RangeNumber.objects.exclude(id=f'{id}')
for a_range in all_ranges:
if a_range.start_num <= start_num <= a_range.end_num:
raise ValidationError('The number is in an exiting number range')
if a_range.start_num <= end_num_int <= a_range.end_num:
raise ValidationError('The number is in an exiting number range')
Я не понимаю :
q = Q() <--- This ?
if self.pk:
Q(id=self.pk)
and With cleaned_data = super().clean() is None ?
Спасибо