2009-07-25 6 views
3

私はジャンゴでのそれらのようなモデルを持っている:としてdjangoの1対1の左への結合は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) 

または

u.messages_recieved.filter(response__message_id__isnull = True) 

が、常に生成された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) 

適切です。実際には、左外部結合を行い、ヌル応答メッセージIDを持つ行をチェックしています。

u.messages_recieved.filter(response=None) 

も問題ありません。

私はdjango 1.1 RCを使用していますが、1.0以上で動作するはずです。

+0

ハ!したがって、上記のいずれも1.0.2では私のために働かないので、1.1RCで修正される可能性があります。私にチェックさせてください。 – 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)) 
関連する問題