У меня есть модель под названием Note
. Каждый Note
принадлежит User
. Note
должен иметь code
, который уникален среди всех Note
из User
, к которым он принадлежит, следовательно, UniqueConstraint
. NoteForm
не включает поле owner
, поскольку, очевидно, я хочу, чтобы оно заполнялось автоматически (пользователь не должен иметь возможность выбирать это).
"""core/models.py"""
from django.db import models
from django.contrib.auth.models import User
class Note(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='note')
code = models.CharField(max_length=60)
...
class Meta:
constraints = [
models.UniqueConstraint(fields=['code', 'owner'], name='code_unique_per_user')
]
"""core/forms.py"""
from django import forms
from core.models import Note
class NoteForm(forms.ModelForm):
class Meta:
model = Note
fields = (
'code',
...
)
"""core/views.py"""
from core.models import Note
from core.forms import NoteForm
def create_note(request):
note = Note(owner=request.user)
if request.method == "POST":
form = NoteForm(request.POST, instance=note)
if form.is_valid():
form.save()
return redirect(reverse('core:manage_notes'))
else:
form = NoteForm(instance=note)
args = {'form': form}
return render(request, 'core/create_note.html', args)
Теперь при создании Note
при использовании NoteForm
, UniqueConstraint
не проверяется во время проверки, потому что форма не включает в себя поле onwer
.
Как лучше всего выполнить эту проверку UniqueConstraint
? Включение поля owner
и установка его как скрытого работает, но не кажется правильным, потому что пользователь может связываться с ним и изменять значение. Также, если нарушено UniqueConstraint
, ошибка связана не с полем code
, а с целой формой. Интересно, должен ли я сам добавить подтверждение, и если да, то где лучшее место?