如何在Django中重新分配外键

时间:2014-12-16 18:21:48

标签: python django django-models django-forms

我有两个以下型号:

 class Student(models.Model):
     name = models.CharField(max_length=255, help_text='Name of student')

 class Group(models.Model):
         name = models.CharField(max_length=255, help_text="Groups' name")
         elder = models.ForeignKey(Student, default=None, blank=True, null=True)

案例是我有表格(从modelForm创建),它能够更新数据库中的条目。我的问题如下: 用户可以使用ForeignKey创建两个组,这些组将指向Student表中的一个条目。

我在文档中找到db_constraint但似乎还不够。 获得以下行为会很棒: 当用户分配已分配给另一个模型的ForeignKey时,我想删除旧的分配并创建新的。所以Student外键一次只能分配给一个模型。

2 个答案:

答案 0 :(得分:2)

覆盖save的{​​{1}}方法:

Group

但您必须使用交易来避免不一致

答案 1 :(得分:1)

OneToOneField专为独特关系而设计:

class Group(models.Model):
    name = models.CharField(max_length=255, help_text="Groups' name")

class Student(models.Model):
    name = models.CharField(max_length=255, help_text='Name of student')
    group = models.OneToOneField(Group, default=None, blank=True, null=True, related_name='elder')

请注意我是如何将关系字段移动到Student模型的,这将为您提供所需的行为。如果它位于Group模型上,并且您已将学生分配给新组,则会因违反DatabaseError约束而引发unique。在这种情况下,(唯一)FOREIGN KEY列位于Student的表中,因此,如果您将学生分配到另一个组并保存该组,则会更新学生表并更新旧组更换。