Django根据相关值选择和订购

时间:2017-01-10 18:26:20

标签: django django-models

我有2个模型:SubscriberNotification

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

1 个答案:

答案 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')