2010-10-04 47 views
1

我將當前使用Propel ORM的web項目轉換爲django項目。如何爲Django的數據模型編寫此類(從Propel的YML格式轉換而來)

我的第一項任務是將模型模式「移植」到django的模型中。

我已閱讀django文檔,但他們似乎沒有足夠的細節。典型的例子,怎麼可能我「口」在行走YML模式定義的(人爲)表如下:

demo_ref_country: 
    code:    { type: varchar(4), required: true, index: unique } 
    name:    { type: varchar(64), required: true, index: unique } 
    geog_region_id: { type: integer, foreignTable: demo_ref_geographic_region, foreignReference: id, required: true, onUpdate: cascade, onDelete: restrict } 
    ccy_id:   { type: integer, foreignTable: demo_ref_currency_def, foreignReference: id, required: true, onUpdate: cascade, onDelete: restrict } 
    flag_image_path: { type: varchar(64), required: true, default: ''} 
    created_at: ~ 

    _indexes: 

     idx_f1:   [geog_region_id, ccy_id, created_at] 

    _uniques: 

     idxu_f1_key: [code, geog_region_id, ccy_id] 

這裏是我的(微弱)試圖至今:

class Country(models.Model): 
    code = models.CharField(max_length=4) # Erm, no index on this column ..... 
    name = models.CharField(max_length=64) # Erm, no index on this column ..... 
    geog_region_id = models.ForeignKey(GeogRegion) # Is this correct ? (how about ref integrity constraints ? 
    ccy_id = models.ForeignKey(Currency) # Is this correct? 
    flag_image_path = models.CharField(max_length=64) # How to set default on this col? 
    created_at = models.DateTimeField() # Will this default to now() ? 
    # Don't know how to specify indexes and unique indexes .... 

[編輯]

對於所有那些暗示我RTFM,我理解你的挫折。只是這個文檔對我來說不是很清楚。這可能是一種Pythonic的文檔方式 - 但是來自C++背景,我覺得可以改進文檔以使來自不同語言的人更容易訪問。

案例:該文檔僅說明ctor中的類名和**選項參數,但不會告訴您可能的選項是什麼。

例如類CharField(MAX_LENGTH =無,[**選項])

有一個線進一步向上給出的可允許的選擇,這適用於所有的字段類型的列表的文件中。

然而,在形式提供的選項:

Field.optionname

類屬性和構造函數參數之間的(顯然隱含的)鏈接是我不清楚。看起來,如果一個類有一個屬性foo,那麼這意味着你可以將一個名爲foo的參數傳遞給它的構造函數。這種觀察是否適用於所有Python類?

回答

0
Class demo_ref_country(models.Model) 
    code= models.CharField(max_length=4, db_index=True, null=False) 
    name= models.CharField(max_length=64, db_index=True, null=False) 
    geog_region = models.ForeignKey(geographic_region, null=False) 
    ccy = models.ForeignKey(Currency_def, null=False) 
    flag = models.ImageField(upload_to='path to directory', null=False, default="home") 
    created_at = models.DateTimeField(auto_now_add=True, db_index=True) 

class Meta: 
    unique_together = (code, geog_region, ccy) 

您可以設置默認值,, db_index paramaeter爲相關字段創建索引。你可以對獨立字段使用unique = True,但是tahat獨一無二將一起檢查列中的唯一性。

UPDATE:首先,我建議你仔細閱讀documentatin,因爲Django的給你很多opportunuties的,其中一些有一些限制......比如,unique_together選項用於只是 Django管理。這意味着如果您創建新記錄或通過管理界面進行編輯,它將被使用。如果你將與其他方式ALSA插入數據(如DataModel.objects.create語句)其更好使用uniaue = true在字段定義,如:

code= models.CharField(max_length=4, db_index=True, null=False, unique=True) 

ForeignKey的字段默認獨一無二的,所以你不需要爲他們定義唯一性。

Django支持方法覆蓋,所以你可以重載模型保存和刪除方法,只要你喜歡。 check it here。 Django也允許你寫原始的sql查詢you can check it here

正如我所解釋的,唯一一起是django管理員功能。所以不要忘記爲必填字段添加unique = True。 唯一在一起還允許您定義不同的唯一對,例如;

unique_together = (('id','code'),('code','ccy','geog_region')) 

這意味着,ID和密碼必須是唯一的一起代碼,CCY和geog_region必須是唯一的一起

更新2:在此之前你的問題更新...

這是更好喲從tutorials開始。它用很好的例子來定義基礎知識。

至於文檔的風格,讓我給你舉個例子,如果你從導師開始,這將是您更容易... 有從模型結構... Doc here

BooleanField 

class BooleanField(**options) 

那定義了數據庫字段的基本結構(),並且它有一些參數作爲選項。那就是部分:

models.BooleansField() 

由於這是一場struvture,可用的選項定義爲:

unique 

Field.unique 

所以,

models.BooleansField(unique=True) 

這是一般用途。由於uniqu是所有字段類型可用的基本選項,因此它被分類爲field.unique。有一些可供選擇的單場的類型,比如對稱這是一個多對多場選項,被列爲ManyToMany.Symmetrical

對於queryset

class QuerySet([model=None]) 
你用一個函數,使用

,但你用它來過濾模型,與其他詞,寫一個過濾器的查詢執行......它有一些方法,如過濾器...

filter(**kwargs) 

由於這需要一些kwargs,和我以前告訴記者,這是用來過濾你的查詢結果,所以kwargs必須是你的模型字段(數據庫表字段)喜歡的:

MyModel.objects.filter(id=15) 

什麼對象是定義了文檔,但它是一個管理器,可以幫助您獲得相關的對象。

Doc包含很好的例子,但你必須從導師開始,這就是我可以建議你...

+0

感謝您的摘錄。現在我可以看到它們如何融合在一起。 – skyeagle 2010-10-06 10:49:37

+0

是否有辦法在插入和刪除(即級聯等)上強制實施RI(參照完整性),就像我在Propel YML模式文件中所做的一樣? – skyeagle 2010-10-06 12:02:49

+0

是unique_together關鍵字嗎?如果是這樣,如果在一個表上有多個集羣(多鍵)索引會發生什麼? – skyeagle 2010-10-06 12:28:49

1

索引會自動生成,以便您引用其他模型(即您的外鍵)。換句話說:您的geog_region_id是正確的(但將它稱爲geog_region會更好)。

您可以使用default field option來設置默認值。

+0

感謝您的意見。從我收集的內容來看,我無法定義一個列並指定一個索引,或者同時指定一個默認值,就像我可以將YML格式用於Propel一樣。似乎我將不得不將任何此類陳述分解爲其組成部分(即列定義,然後創建索引,設置默認值等)。我的理解是否正確? – skyeagle 2010-10-04 21:31:12

1

對不起,您還沒有閱讀文檔。在field reference page上簡單搜索index,uniquedefault可準確顯示如何設置這些選項。

在評論後編輯我不明白你對多行的意思。 Python不關心你括號內多少行使用 - 所以這個:

name = models.CharField(unique=True, db_index=True) 

是完全一樣的:

name = models.CharField(
      unique=True, 
      db_index=True 
     ) 

Django不支持多列主鍵,但如果您只需要一個多列唯一約束,請參見unique_together

+1

我已經看到並閱讀該頁面。我所見過的所有例子都有用1行語句定義的表格列。因此,我期望可以在一行中定義一列(包括索引) - 看起來你不能這樣做,而且你必須將語句分成幾個語句(一個用於數據類型,另一個用於索引),當使用Django的模型框架。關於多列索引,我仍然無法在文檔中找到 - 您能否指出我有多列索引的例子? – skyeagle 2010-10-04 21:29:00

1
import datetime 
class Country(models.Model): 
    code = models.CharField(max_length=4, unique=True) 
    name = models.CharField(max_length=64) 
    geog_region = models.ForeignKey(GeogRegion) 
    ccy = models.ForeignKey(Currency, unique=True) 
    flag_image_path = models.CharField(max_length=64, default='') 
    created_at = models.DateTimeField(default=datetime.now()) 

(我在推進的ORM不是專家)

的Django總是試圖模仿 「ON DELETE CASCADE」 的行爲,因此無需指定地方。默認情況下,所有字段都是必需的,除非另有指定 對於日期時間字段,請參閱here。所有常規字段選項here

1
code = models.CharField(max_length=4) # Erm, no index on this column ..... 
name = models.CharField(max_length=64) # Erm, no index on this column ..... 

您可以通過兩種以上的unique = True關鍵字參數和值。

geog_region_id = models.ForeignKey(GeogRegion) # Is this correct ? (how about ref integrity constraints ? 
ccy_id = models.ForeignKey(Currency) # Is this correct? 

上述線是正確如果GeogRegionCurrency被這個模型定義。否則,請在模型名稱周圍加引號。對於例如models.ForeignKey("GeogRegion")。見documentation

flag_image_path = models.CharField(max_length=64) # How to set default on this col? 

簡單。使用default = "/foo/bar"關鍵字參數和值。

created_at = models.DateTimeField() # Will this default to now() ? 

不自動。你可以做default = datetime.now(記得第一個from datetime import datetime)。或者,您可以指定auto_now_add = True

# Don't know how to specify indexes and unique indexes .... 

看看unique_together

您會看到我鏈接到的文檔與其他人指出的文檔相同。我強烈建議您閱讀文檔並通過tutorial工作。

相關問題