2012-10-19 33 views
0

我有一個表messages。在我的應用程序中,用戶可以發送不同的類型的消息。像轉發一個事件,等等。因此,我在該表中列有typevalueDjango ORM加入另一個表

我想要做的是針對特定的type,轉到一個特定的表並確保value有效(通常這映射到該表的id)。可能有多種類型,每一種都必須映射到不同的表格。有沒有一種方法在內置的Django ORM中進行邏輯寫入?現在,我只看到了這個可行的,如果我直接使用SQL,我寧可不要,如果我可以逃脫它...

現在我做這樣的事情:

Messages.objects.all().filter(Q(user_id=id))...etc 

我想添加上面的檢查type和特定的type的聲明,檢查與其關聯的表格。

回答

1

這聽起來像你有一個「多態關聯」。有幾種方法可以在Django中做類似的事情,但我認爲最接近您所描述的模塊的是contenttypes模塊,該模塊在應用程序中爲類型和值使用單獨的列。

+0

不..不要這樣。因爲我的'type'列可以映射到幾種類型的表,而不僅僅是一個......所以'value'列必須使用基於'type'的表......這有意義嗎? – KVISH

+0

這聽起來完全像什麼內容類型。多態關聯是指當您有一個外鍵可以指向多個表中的任何一個表中的一行時,而不是僅指向單個預定義表中的行。看看我鏈接的文檔中的「通用關係」部分。 –

+0

你確定嗎?抱歉有更多問題。但是,如果'type'是'E',我希望它檢查'event'表,如果它是'M',我希望它檢查'user'表中的'value' ... – KVISH

0

您可能只是想定義一個multi-table inheritance結構。這會得到相同的結果,因爲您擁有多種類型的消息和字段繼承,但您根本不必混淆type字段。

class Message(models.Model): 
    value = models.CharField(max_length=9000) 

class Event(Message): 
    pass 

class Tweet(Message): 
    pass 

鑑於後處理程序:

... 
if request.POST['type'] == 'event': 
    Event.objects.create(value=request.POST['value']) 
elif request.POST['type'] == 'tweet': 
    Tweet.objects.create(value=request.POST['value']) 
... 

然後,讓你的對象:

all_tweets = Tweet.objects.all() 
all_messages = Message.objects.all() 

for message in all_messages: 
    try: 
     event = message.event 
    except Event.DoesNotExist: 
     # this message is not an Event 
     pass 

如果這種結構不適合你,還有其他兩種風格的Django支持的模型繼承:Abstract base classesProxy models。您也可以按照@AndrewGorcester的建議持有GenericForeignKey