0

所以假设我们有这个模型:

class Student(models.Model):
    am = models.SmallIntegerField(unique=True, primary_key=True) # XXX: max_value = 10000
    date_enrolled = models.DateField('Date Enrolled')
    semester = models.IntegerField(default=1)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    undergraduate = models.BooleanField(default=True)

像这样的更新视图:

class StudentUpdateView(SqlPresenterMixin, StudentMixin, UpdateView):   
    model = Student
    form_class = StudentForm
    template_name = "profapp/student_form.html"
    slug_field = "am"

然后这个测试失败了:

class TestStudent(TestCase):
    def setUp(self):
        self.c = Client()
        Student.objects.create(am=2222, first_name="Chris",
                        last_name="Perivolas",
                        date_enrolled=datetime.date(year=2010, day=15,
                                                    month=2))
        Student.objects.create(am=7362, first_name="Mary",
                        last_name="Karagewrgena",
                        date_enrolled=datetime.date(year=2010, day=15,
                                                    month=2))

    def test_update(self):
        """
        """
        r = self.c.post("/profapp/students/2222/update/",
                        dict(am=7363, first_name="Chris",
                             last_name="Perivolas",
                             date_enrolled="3/15/2010",
                             semester=2,
                             undergraduate=1))
        self.assertEquals(Student.objects.filter(am=2222).exists(), False)

简而言之,更新主键时更新视图不​​会删除旧条目。解决这个问题的最佳方法是什么?

4

1 回答 1

2

根据 Django 文档,PK 永远不应该改变。PK 将您的对象与数据库中的特定行联系起来。当您更改 PK 时,Django 会失去与数据库中原始行的连接,并假定您要创建另一行。

如果你真的需要它,你应该添加另一个字段作为可更改的 id。

于 2013-05-26T06:24:56.413 回答