2013-11-24 70 views
3

我讀過Django中的表名可以使用Meta Options來定製。我想知道如何使用db_table選項來繼續使用應用程序名稱,但稍微修改模型名稱而不用硬編碼應用程序名稱。在Django中更改表名

例如,從Django教程中,應用程序名稱爲「民意調查」,型號名稱爲「民意調查」。可以說我希望表格被稱爲「polls_mypoll」而不是「polls_poll」。以下是我嘗試過,但在外部類不能被訪問(沒有規定投票)

class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

    class Meta: 
     db_table = "%s_%s" % (Poll._meta.app_label, "mypoll") 

同樣,如果我想明確定義db_table僅僅是默認polls_poll什麼?我知道我可以完全拋棄Meta類,並使用默認名稱,但如果我想明確說明它,該怎麼辦?

class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

    class Meta: 
     db_table = "%s_%s" % (Poll._meta.app_label, Poll._meta.model_name) 

這不起作用,因爲Poll沒有在Meta中定義。

+0

這不是說民意調查應該被宣佈_內容_ Meta可以被訪問;它在Meta解析的時候沒有被完全解析。 – XORcist

回答

0

你得到,Poll is not defined唯一的例外,是由您的db_table = "%s_%s" % (Poll._meta.app_label, Poll._meta.model_name)聲明引用Poll類是仍在建設中,而它造成的(尚未插入全局範圍)。如果要在db_table中使用對Poll的引用,請考慮編寫自己的繼承自ModelBase的元類,並正確設置_meta.db_table值。此時,Poll名稱將不可用,但實際的對象將被構建並在您手中進行操作。

+0

也許你可以在Meta類上使db_table成爲@property來懶惰地生成/查找表名(在派生元類中)。 – XORcist

+0

@XORcist,好吧,是的 - 它可以檢測到該值是否可調用 - 如果是,則將其替換爲'callable(class)'的結果。關於'@ property',如果需要的話,您需要將該方法複製粘貼到其他模型,因爲在構建時無法將基礎模型類(我現在可以想到)傳遞給派生的Meta類。 –

+0

@XORcist,還要注意'_meta'被複制了'Meta'類(_not instance_)聲明的內容,因此'_meta'將是屬性對象,而不是描述符。 –