Django - 避免在多对多中间模型中重复

时间:2014-10-28 20:00:37

标签: django django-models django-admin

我正在使用模型PersonProject编写一个简单的应用程序,它通过Membership模型有多对多的关系。给定MembershipPerson个对象之间只能存在一个Project。目前,可以通过MembershipPerson更改表单内联添加新的Project个对象。

这很好用,但是存在用户意外创建冗余Membership的问题。我为unique_together模型中的两个外键设置了Membership约束,但这有两个问题:

  1. 保存新的父对象时,会保存Membership模型的所有冗余实例,而不会引发任何类型的错误。
  2. 修改现有对象时,添加冗余Membership会触发预期的错误消息,但未显示相应内联的删除图标,并且无法删除其中一个对象已被持久化,因为该错误会阻止任何数据库操作发生。
  3. 我想知道在保存父对象之前迭代membership_set集合的正确方法是什么,并删除任何冗余对象。

1 个答案:

答案 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