2011-12-27 46 views
2

我有用戶提交的內容,我試圖寫入一個文件,然後保存到FileFieldDjango FileField.save()使重複文件

所以我有一個模型,看起來像這樣:

class Revision(models.Model): 
    def custom_revision_file_path(instance, filename): 
     return '/'.join(['content/revisions', filename]) 
    path = models.FileField(upload_to=custom_revision_file_path) 
    document = models.ForeignKey(Document) 
    ... 

觀點創建實例如下:

def handle_revisions(request): 
    document = Document.objects.get(id=request.GET['docid']) 
    basename = os.path.basename(str(document.path)) 

    revision = Revision.objects.create(
     document = document, 
    ) 
    revision.path.save(basename, ContentFile(request.GET['revision'])) 

這一切工作相對良好,但對於兩個問題:

1)ContentFile在我的字符串中的每個字母之間放一個空格,所以'test'變成't e s t';

2)由於某種原因每次運行視圖時兩個Revision實例保存的路徑大致相同。即。一個路徑將是'content/revisions/test.txt',另一個將是'content/revisions/test_1.txt',而第二個路徑根本不應該存在。

什麼給?

+0

對於任何人來這個問題。我主要轉向更優雅的解決方案,但發現使用http://chronosbox.org/blog/jsonresponse-in-django?lang=en是複製我的對象實例的源代碼。奇怪,因爲我以前使用過這個模塊......但它似乎並沒有在這裏很好地工作。 – 2011-12-28 03:33:19

回答

2

首先,你不應該使用類似的東西來創建一個路徑:

'/'.join(['content/revisions', filename]) 

但:

os.path.join("my_dir", "my_subdir", ..., "filename.txt") 

你不應該知道,如果你的應用程序上Unix的運行像Windows(是的,有些人使用Windows作爲網絡服務器)。

此外,您不應該調用您的FileField屬性path,這與FilePathField含糊不清。

這個字段是NOT NULL?因爲在你的create()聲明中你沒有提供。這應該會引發錯誤。

我不明白這一點:

revision.path.save(basename, ContentFile(request.GET['revision'])) 

你到底想達到什麼目的?您確定要在文件中存儲GET參數嗎?

要回答你的問題,在默認情況下,Django不採取責任到覆蓋該文件系統上存在的文件,這就是爲什麼它會自動將其與unique path通過添加後綴存儲。

如果此行爲不合適,請考慮編寫一個custom file storage

+0

要明確它是用它們自己的文件創建兩個類版本的實例。我想我明白爲什麼ContentFile()會創建一個文件,然後是'revision.path。save()'會創建一個文件,但是我看不到它在創建第二個修訂版本對象的位置。 – 2011-12-27 22:55:15

+0

因爲如果您兩次調用'MyModel.objects.create()',就會在數據庫中創建兩個條目!您需要使用'get_or_create()'來檢索或創建記錄。 'ContentFile'不創建文件(在文件系統上),這更像是一個'StringIO',在內存中。 – Stan 2011-12-27 23:07:36

+0

對不起,如果我很密集,但我仍然沒有看到它。我調用'Revision.objects.create()'一次,並調用'instance.file_field.save()'一次。任何機會,你可以告訴我一個工作的例子或一些sudo代碼?我不知道我會在哪裏或爲什麼使用'get_or_create'。請參閱http://groups.google.com/group/django-users/browse_frm/thread/184e5e09db1efce4/7816cbc650d8dc77以瞭解我正在從事的基本參考。 – 2011-12-27 23:16:31