我有2个模型:Subscriber
和Notification
。
class Subscriber(models.Model):
email = models.CharField()
class Notification(models.Model):
subscriber = models.ForeignKey(Subscriber, related_name='notifications')
timestamp = models.DateTimeField(default=timezone.now)
type = models.SmallIntegerField(choices=TYPES)
我想要检索的是在过去5分钟内没有收到通知(基于type
)并在上次收到提升时订购的订阅者。
我可能会在sql中使用子查询或其他东西解决这个问题,但我想知道它是否可以在Django中使用。
这是一个可以完成我需要的工作SQL查询:
SELECT
s.*
FROM
subscribers s
LEFT JOIN
notifications n
ON( n.subscriber_id = s.id )
WHERE
(
( NOT EXISTS
(
SELECT
NULL
FROM
notifications nn
WHERE
nn.subscriber_id = s.id
)
OR
(
n.type = 1
AND n.timestamp < Curdate() - INTERVAL 5 minute
)
)
)
ORDER BY
pu.timestamp ASC
答案 0 :(得分:0)
您可以使用exclude
queryset方法排除 收到通知的订阅者,然后使用收到的最后一个通知批注查询集以提供订单。
from datetime import timedelta
from django.db.models import Max
five_minutes_ago = timezone.now() - timedelta(minutes=5)
Subscriber.objects.exclude(
notifications__type='notification_type_x',
notifications__time__gt=five_minutes_ago
)
.annotate(last_notification=Max('notifications__time'))
.order_by('last_notification')