3

私は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 のバグですか?

4

2 に答える 2

3

同様の結果を達成しようとしたときに私がしたことは次のとおりです。

u.messages_received.filter(~Q(response__id__gt=0))
于 2009-07-26T01:20:16.077 に答える
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 が null の行をチェックしています。

u.messages_recieved.filter(response=None)

うまく動作します。

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

于 2009-07-27T14:07:48.550 に答える