2013-05-26 26 views
0

因此,可以說,我們有這種模式:Django的更新視圖不​​會刪除塔舊條目,如果主鍵編輯

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) 

簡而言之,更新視圖不​​會在更新ap時刪除舊條目rimary密鑰。解決這個問題的最好方法是什麼?

+0

PK爲什麼被允許改變?這會導致數據完整性問題。 –

回答

2

根據Django文檔,PK不應該改變。 PK是將你的對象綁定到數據庫中的特定行。當您更改PK時,Django會丟失與數據庫中原始行的連接並假定您想要創建另一行。

如果您確實需要,您應該添加另一個字段以充當可更改的ID。

+0

好吧,因爲這是不好的做法,無論如何,我只是不會讓它可編輯。謝謝。 – fakedrake