這是我在我的項目是如何做:
#Models.py
class Person(models.Model):
user = models.OneToOneField(User, primary_key=True)
field = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
視圖
#views.py
class GroupDetails(generic.DetailView):
model = Group
template_name = 'app/template.html'
form_class = SomeForm
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
#get group
group = self.get_object(queryset=Group.objects.all())
#get person
person = Person.objects.get(pk=request.user)
#check if objects exists before save
if Membership.objects.filter(person = person, group = group).exists():
messages.error(request, 'Oh this is duplicated')
return HttpResponseRedirect(reverse('view-name', kwargs={'pk': group.pk}))
else:
if form.is_valid():
form.save(commit=False)
#assign to the through table
persontogroup = Membership.objects.create(person = person, group = group)
persontogroup.save()
messages.success(request, 'Success!')
return HttpResponseRedirect('/something/')
希望這有助於。您也可以檢查:Avoid Django def post duplicating on save
還有其他一些問題。 'unique_together'是一個數據庫級的約束,在Django中沒有什麼可以做的,這會導致創建冗餘行。所以如果你看到多餘的行,問題是你的'unique_together'工作不正常。你確定你已經遷移了這個變化,並且它已經被應用到數據庫了嗎?你能看看你的數據庫並確認約束存在嗎?你真的能看到你認爲已經創建的重複行嗎? – 2014-10-28 21:41:35
感謝您的建議,事實證明我沒有運行相應的遷移。但是,現在當我保存一個新的父對象時,我得到一個服務器異常而不是驗證錯誤,所以我仍然有問題。 – jflorezf 2014-10-29 17:13:06