2009-07-25 2 views
3

내가있어 모델 :django 일대일 왼쪽 조인이 null입니까? 장고에있는 것과 같은

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) 

또는

:

나는이 될 것이라고 할 수있는 자연적인 방법을 생각할 것

하지만 항상 생성 된 SQL이 될 수있을 테니까요 :

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

내가 멍청한 짓을하고 있는가, 또는이 장고의 버그? 유사한 결과를 달성하려고 할 때 내가했던

답변

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) 

내가 생각하는 적절하다. 실제로 왼쪽 외부 조인을 수행하고 null 응답 메시지 ID가있는 행을 확인합니다.

u.messages_recieved.filter(response=None) 

도 잘 작동합니다.

나는 django 1.1 RC를 사용하고 있지만 이것은 1.0 이상에서 작동 할 것입니다.

+0

하아! 그래서 1.1RC에서 수정 될 수 있습니다. 위의 어느 것도 1.0.2에서는 저에게 맞지 않습니다. 내가 체크해 볼게. – tpk

+0

그래서 1.1에서 수정되었습니다. 1.1의 최종 릴리스에서 테스트되었습니다. – tpk

+0

ORM은이 새 버전에서 많은 개선 사항을 받았습니다. 흥미롭게도 필자는 1.0.3 Alpha & 1.1에서만 작업을 수행했으며 둘 다 동일한 쿼리를 생성했습니다. – tarequeh

3

뭔가는 다음과 같습니다

u.messages_received.filter(~Q(response__id__gt=0)) 
관련 문제