2013-06-25 140 views
2

我真的很茫然,因爲這根本沒有意義。我打電話保存/創建一個對象,並且它不會顯示在管理站點中。我甚至使用SQLite Viewer程序檢查了SQLite數據庫,該程序再次顯示該項目未被保存。即使在「保存」調用後,Django對象也不會保存

這是節省了Data對象的代碼:

 data = Data(represents=field, for_entry=entry, value="This can be anything") 
     # field is a DataField db object and entry is a Entry db object (see model below and paragraph) 
     print("B4", data) #<---- Shows that Data has not been assigned an ID/pk 
     data.save() 
     print("8ER: ", data) #<--- Shows that Data has been assigned an ID/pk 

你可以從我的意見看,我知道的數據對象的save調用,我想意思是以後分配一個ID有效。沒有任何錯誤拋出。 fieldentry都是。每個人似乎都沒問題,因爲他們有正確的ID,用[table name].objects.get(id=...)進行檢索,我可以保存/編輯它們,並保存更改。

即使陌生,在這個功能確切的代碼被稱爲右側前這一個工程。

這是我model.py(我拿出了一些功能,使其更短):

class Entry(models.Model): 
    parent = models.ForeignKey('Entry', blank = True, null = True, default=None) # The entry this subs. Is left blank for top level entries. 
    id_number = models.CharField(max_length=20) 
    visible = models.BooleanField() 
    data_field = models.ForeignKey('DataField', default=1) # The field that this entire entry falls under. REDUNDANT BUT NECISSARY 

    def __str__(self): 
     return str(self.id)+ "-" + str(self.id_number) 

class DataField(models.Model): 
    parent = models.ForeignKey('DataField', related_name='parent field', null=True, blank=True, default=1) 
    order = models.IntegerField() 
    multiple_entries = models.BooleanField(default=True) 
    DATA_TYPES = (('t', 'Text'), ('d', 'Date'), ('l', 'List'), ('o', 'Option'), ('b', 'Boolean'), ('f', 'Foreign Key'), ('r', 'Root'), ('bb', 'Branch'), ('i', 'Image'), ('ff', 'File'), ('h', 'Holder'), ('bt', 'Big Text')) # A number means it is a foreign key. Should go off title. 
    foreign_source = models.ForeignKey('DataField', null=True, blank=True) # Points to DATA FIELD WHO'S MATCHING DATA WILL MAKE UP THE OPTIONS 
    data_type = models.CharField(max_length=2, choices=DATA_TYPES, default='t', null=True, blank=True) 
    title = models.CharField(max_length=100, null=True, blank=True) 
    visibility = models.BooleanField(default=False) 

    def __str__(self): 
     return str(self.id) + "-" + str(self.title) 

    def __eq__(self, other): 
     if not isinstance(other, DataField): 
      return False 
     if self.data_type == 'h': 
      return self.title == other.title 
     return self.id == other.id 


class Data(models.Model): 
    represents = models.ForeignKey('DataField') 
    for_entry = models.ForeignKey('Entry', null=True) 
    value = models.CharField(max_length=1000000) 

    def __str__(self): 
     return self.represents.title + "-" + str(self.for_entry.id) + "-" + str(self.value) + "-" + str(self.id) 

這可能是我缺少明顯的東西,或者也許你需要的方式更多的信息比我能提供要解決這個問題。如果沒有足夠的信息,請發表評論並請求更多信息,或只列出可能發生的問題。

+0

AUTOCOMMIT被偶然設置爲false,而另一個函數正在執行顯式提交? – Sid

+0

請提供您正在執行的代碼,即save()方法失敗的代碼片段。如果我們可以看到save()的參數是什麼,會更容易。 – pkacprzak

+0

@pkacprzak不幸的是,他們在節目中的一個完全不同的部分要設置(即與其他幾個部分。因此,可能60多行代碼進行交互)。從我所能做的每個測試中,它們似乎都是DateField和Entry類的有效數據庫對象。最後一個參數(值)可以是一個基本的字符串,但它仍然不起作用。 –

回答

1

嘗試手動提交。我不知道還有什麼建議。

from django.db import transaction 

@transaction.commit_manually 
def viewfunc(request): 
    ... 
    data.save() 
    transaction.commit() 
+0

感謝您的全力幫助。我剛剛結束了卸載並重新安裝的Django與蟒蛇的最新版本的新vertualenv(我用的是python3.2)。然後我複製了所有的代碼。我不知道爲什麼,但它工作。也許我在設置文件中搞砸了一些東西。再次感謝! –

+0

嗯,我只是很高興它爲你工作。猜猜我們永遠不會發現它不工作的原因...... – Sid

1

我有一個類似的問題做了單元測試,但是遇到一個錯誤的地方出現的保存方法是行不通的 - >結果如下

p = MyModel.objects.get(pk=myparam) 
self.assertEqual(p.my_attr, value) 
myfunc() # Code that changed the same object p is referencing 
self.assertEqual(p.my_attr, new_value) 

雖然我改變了上面甚至失敗該對象被引用到新值,然後在對象上執行.save()。

要解決此問題,我必須將p重新分配給MyModel對象。我在單元測試中的固定代碼看起來像這樣。

p = MyModel.objects.get(pk=myparam) 
self.assertEqual(p.my_attr, value) 
myfunc() # Code that changed the same object p is referencing 
p = MyModel.objects.get(pk=myparam) 
self.assertEqual(p.my_attr, new_value) 

這似乎是與變量指向舊的位置在內存中的一個問題,但我纔開始編程5個月前,所以我在一點點在我頭上:)我真的很感激,如果反饋任何人都可以解釋爲什麼這會發生,因爲我仍然難倒了。

如果你真的不認爲保存方法執行時,你可以通過覆蓋保存方法,並添加一個print語句做了仔細的檢查。它看起來類似如下:

class MyModel(models.Model): 
    attr = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(MyModel, self).save(*args, **kwargs) 
     print('Did this attribute update? (attr):', self.attr) 
     print('Save method executed!') 

編輯:內嵌的內存位置的理論,我做了這個簡單的例子:

In [3]: a = 1 
In [4]: b = a 
In [5]: hex(id(a)) 
Out[5]: '0x100240280' 
In [6]: hex(id(b)) 
Out[6]: '0x100240280' 
In [7]: a = 2 
In [8]: b 
Out[8]: 1 
In [9]: hex(id(a)) 
Out[9]: '0x1002402a0' 
In [10]: hex(id(b)) 
Out[10]: '0x100240280' 

還是很想聽到任何人的想法。

相關問題