我正在使用模型Person
和Project
编写一个简单的应用程序,它通过Membership
模型有多对多的关系。给定Membership
和Person
个对象之间只能存在一个Project
。目前,可以通过Membership
和Person
更改表单内联添加新的Project
个对象。
这很好用,但是存在用户意外创建冗余Membership
的问题。我为unique_together
模型中的两个外键设置了Membership
约束,但这有两个问题:
Membership
模型的所有冗余实例,而不会引发任何类型的错误。Membership
会触发预期的错误消息,但未显示相应内联的删除图标,并且无法删除其中一个对象已被持久化,因为该错误会阻止任何数据库操作发生。我想知道在保存父对象之前迭代membership_set
集合的正确方法是什么,并删除任何冗余对象。
答案 0 :(得分:1)
这就是我在项目中的表现:
#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