У меня есть форма, где я проверяю в чистом методе, существует ли объект ProjectMembership уже, который имеет те же значения для проекта и участника. Это должно, что я определил в модели ProjectMembership unique_together ограничение для проекта и участника. Это хорошо работает на самом деле.
class ProjectMembershipForm(forms.ModelForm):
project = forms.ModelChoiceField(Project.objects, widget=HiddenInput())
class Meta:
model = ProjectMembership
def clean(self):
cleaned_data = self.cleaned_data
project = cleaned_data.get("project")
member = cleaned_data.get("member")
print ProjectMembership.objects.filter(project=project, member=member).count()
if ProjectMembership.objects.filter(project=project, member=member).count() > 0:
del cleaned_data["project"]
del cleaned_data["member"]
raise forms.ValidationError('The user "%s" is already part of the project team for project "%s".' % (member, project))
return cleaned_data
Но теперь я спрашиваю меня, как я могу судить в чистом методе, пытается ли пользователь создать новые отношения или обновить отношения. Поскольку с этим чистым методом не возможно сделать обновление, так как это возвращает сообщение об ошибке, что запись уже существует.
Вы можете попробовать изменить это:
if ProjectMembership.objects.filter(project=project, member=member).count() > 0:
на что-то вроде этого:
if ProjectMembership.objects.filter(project=project, member=member).exclude(pk=self.instance.id).count() > 0:
на самом деле вам нужно проверить, не имеет ли self.instance значение None, прежде чем использовать его в exclude, но, надеюсь, этот небольшой фрагмент дал вам некоторое представление о том, как вы можете выполнить свою задачу без дублирования форм.