2009-12-07 47 views
6

我需要用一堆虛擬條目(大約200+)填充我的數據庫,以便測試我所做的管理界面,並且想知道是否有更好的方法去做吧。我昨天花了我一天中最好的時間試圖手工填充它(即通過將這樣的東西包裝成my_model(title =「asdfasdf」,field2 =「laksdj」...)在一堆「for x in range 0,200):「循環),並放棄,因爲它沒有按照我預期的方式工作。我認爲this是我需要使用的,但是您是否需要在數據庫中擁有(存在)數據才能運行?Django - 爲測試目的填充數據庫

+0

您不想序列化。你想通過在shell中運行來創建初始數據,保存實例,然後使用loaddata將數據庫導出爲像json這樣的格式:'python manage.py dumpdata --format = json --indent = 4 appname' @Matthew Schinckel在這方面是最接近的。 – hughdbrown 2009-12-07 03:48:57

回答

7

檢查這個程序

https://github.com/aerosol/django-dilla/

比方說,你寫博客應用程序(噢,你喜歡的!)在Django。單元測試進行得很好,並且所有的運行速度都非常快,甚至是ORM生成的超長查詢。你已經添加了幾個分類的帖子,它仍然是穩定的。您很確定該應用程序的效率很高,並且可以進行實時部署。對?錯誤。

+0

這正是我一直在尋找的東西。謝謝一堆! – cornjuliox 2009-12-08 17:46:57

+0

@Eeyore:你的回覆不會讓我睡覺。 – misterte 2013-02-28 18:14:54

4

您可以使用燈具來達到此目的,並使用loaddata管理命令。

一種方法就是這樣做。

  1. 準備您的測試數據庫。

  2. 使用dumpdata創建數據庫的JSON導出。

  3. 把它放在你應用程序的fixtures目錄下。

  4. 編寫你的單元測試來加載這個「fixture」。

+0

我只需要添加一些細節。 – 2009-12-07 02:57:59

0

我不知道爲什麼你需要任何序列化。只要您將Django settings.py文件設置爲指向您的測試數據庫,填充測試數據庫應該只是保存模型。

for x in range(0, 200): 
    m = my_model(title=random_title(), field2=random_string(), ...) 
    m.save() 

有更好的方法來做到這一點,但如果你想快速測試儀,這是要走的路。

+0

而你正在shell的環境中運行,對吧? 'python manage.py shell' – hughdbrown 2009-12-07 03:42:44

3

Django fixtures提供了一種在syncdb上導入數據的機制。但是,通過Python代碼來執行初始數據傳播通常更容易。您概述的技術應該可以工作,通過syncdb或管理命令。例如,通過執行syncdb,在my_app/management.py

def init_data(sender, **kwargs): 
    for i in range(1000): 
     MyModel(number=i).save() 

signals.post_syncdb.connect(init_data) 

或者,在management commandmyapp/management/commands/my_command.py

from django.core.management.base import BaseCommand, CommandError 

from models import MyModel 

class MyCommand(BaseCommand): 
    def handle(self, *args, **options): 
     if len(args) > 0: 
      raise CommandError('need exactly zero arguments') 

     for i in range(1000): 
      MyModel(number=i).save() 

然後,您可以將此數據導出到一個固定設備或繼續使用管理命令導入。如果您選擇繼續使用syncdb信號,則需要有條件地運行init_data函數以防止在隨後的syncdb調用中導入數據。當一個燈具不夠用時,我個人喜歡這樣做:創建一個管理命令來導入數據,但是第一個syncdb調用會自動執行導入。這樣,部署更加自動化,但我仍然可以輕鬆地修改初始數據並重新運行導入。

0

我會建議django-autofixtures給你。我嘗試了django_seed和django-autofixtures,但是django_seed在使用唯一鍵方面存在很多問題。 django-autofixtures在填充數據庫時負責獨特的主要和其他數據庫約束條件