Проверка уникальности модели "многие ко многим" по внешнему ключу поля модели
У меня есть 3 модели:
class Citizenship(models.Model):
name = models.CharField()
class Destination(models.Model):
name = models.CharField()
class RestrictionGroup(models.Model):
destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
citizenship = models.ManyToManyField(Citizenship)
Я хочу, чтобы мое гражданство было уникальным на основе связанного пункта назначения. Если моим пунктом назначения является Англия, и если у меня есть 5 групп ограничений, каждая группа ограничений, связанная с пунктом назначения, должна иметь уникальное гражданство.
на этом изображении Греция продублирована, но мне нужны уникальные страны для страны назначения.
Итак, как можно проверить это и вернуть дружественное сообщение об ошибке?
любая помощь приветствуется, заранее спасибо.
Я решил свою проблему с методом save_formset и поделюсь своим кодом, если в будущем он кому-нибудь понадобится.
Сначала я собираю все значения гражданства, принадлежащие назначению, после чего использую метод set() и сравниваю len(list_data) с len(set_data), если они не совпадают, значит, введено дублированное значение.
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
citizenship_list = []
for dep in formset.cleaned_data:
if dep.get('citizenship'):
for country in dep.get('citizenship'):
citizenship_list.append(country.name)
citizenship_set = set(citizenship_list)
if len(citizenship_list) != len(citizenship_set):
self.message_user(request, message="Duplicate Citizenship value", level=messages.ERROR)
else:
for obj in formset.deleted_objects:
obj.delete()
for instance in instances:
instance.user = request.user
instance.save()
formset.save_m2m()