2009-07-25 53 views
3

我有模型,如那些在Django:django一對一的左連接爲空?

class User(models.Model): 
    name = models.CharField(max_length = 128) 

class Message(models.Model): 
    sender = models.ForeignKey(User, related_name = 'messages_sent') 
    recipient = models.ForeignKey(User, related_name = 'messages_recieved') 
    subject = models.CharField(max_length = 128) 
    body = models.CharField(max_length = 3500) 

class Response(models.Model): 
    message = models.OneToOneField(Message, primary_key = True) 
    reply = models.TextField() 

,我試圖讓一切針對無反應,這是我會在SQL編寫的用戶消息:

select * from user u 
     join message m on (u.id = m.recipient_id) 
     left join response r on (m.id = r.message_id) 
where r.message_id = null 

我倒是覺得自然的方式來做到這一點是:

u.messages_recieved.filter(response = None) 

u.messages_recieved.filter(response__message_id__isnull = True) 

但始終生成的SQL結束是:

WHERE ("project_message"."recipient_id" = 1 AND "project_message"."id" IS NULL) 

我做一些愚蠢的事,或者這是在Django的錯誤嗎?

回答

3

嘗試:

user.messages_recieved.filter(response__isnull=True) 

結果查詢是:

SELECT "messaging_message"."id", "messaging_message"."sender_id", "messaging_message"."recipient_id", "messaging_message"."subject", "messaging_message"."body" FROM "messaging_message" LEFT OUTER JOIN "messaging_response" ON ("messaging_message"."id" = "messaging_response"."message_id") WHERE ("messaging_message"."recipient_id" = 1 AND "messaging_response"."message_id" IS NULL) 

我認爲是適當的。它確實正在執行左外連接,然後檢查具有空響應消息ID的行。

u.messages_recieved.filter(response=None) 

也能正常工作。

我使用django 1.1 RC,但這應該在1.0+。

+0

哈!所以它可能被固定在1.1RC中,因爲在1.0.2中以上都不適合我。讓我檢查一下。 – tpk 2009-07-27 18:49:22

3

東西要達到同樣的結果時,我所做的就是:

u.messages_received.filter(~Q(response__id__gt=0))