В 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 ?

Спасибо

Вернуться на верх