2015-11-04 93 views
5

所以我有一個問題,我正在考慮創建一個表,其中有一個外鍵到其他幾個表,並使用另一個字段「類型」來說什麼表該鍵應該屬於。Django對許多表模型一個外鍵

class Status(Models.model): 
    request = models.ForeignKey("Request1", "Request2", "Request3") 
    request_type = models.IntegerField() 
    ...Some status related data 

class Request1(Models.model): 
    ...Some data 

class Request2(Models.model): 
    ...Some other data 

Class Request3(Models.model): 
    ...different data 

我的問題是,是否可以定義這樣的外鍵? 另一種解決辦法我認爲是這樣定義

class Status(Models.model): 
    request1 = models.ForeignKey("Request1") 
    request2 = models.ForeignKey("Request2") 
    request3 = models.ForeignKey("Request3") 
    ...Some status related data 

class Request1(Models.model): 
    ...Some data 

class Request2(Models.model): 
    ...Some other data 

Class Request3(Models.model): 
    ...different data 

我的模型,但如果我這樣做,這樣,纔有可能定義通過Django的約束,說只有1外鍵允許有數據和其他兩個必須爲空?或者我將不得不在數據庫端嚴格設置這個約束(我使用的是postgres)我希望能夠告訴django在創建數據庫的時候這樣做,所以我不必每次都記得有人重新創建數據庫。

任何意見或建議將不勝感激。我沒有結過這兩種想法,所以如果有另一種巧妙的方法來達到同樣的效果,我很樂意聽到它。感謝您的時間。

編輯:我使用Django 1.7.10

+0

你只想三個之一是FK? –

+0

對不起,每個狀態只能鏈接到一個請求。 – mingle

回答

12

您應該使用在Django的contentypes框架。

有一個通用的關係,這裏的例子:https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#generic-relations 您的需求可能是這個樣子:

from django.db import models 
from django.contrib.contenttypes.fields import GenericForeignKey 
from django.contrib.contenttypes.models import ContentType 

class Status(models.Model): 
    request_type = models.ForeignKey(ContentType) 
    request_id = models.PositiveIntegerField() 
    request = GenericForeignKey('request_type', 'request_id') 

然後,您可以做類似如下:

status1 = Status(request=Request1("foo")) 
status1.save() 
status2 = Status(request=Request2("bar")) 
status2.save() 

status1.request // <Request1 "foo"> 
status1.request // <Request2 "bar"> 
+0

哇,這看起來完全像我在找的東西。非常感謝你 – mingle

+0

哈哈,是的。好的直覺;-) – Sebastian

+0

好的,有一個問題:如何從foo或object訪問狀態對象? –