2017-01-10 7 views
0

私は2モデル:SubscriberNotificationを持っています。私が取得したい何Djangoは関連値に基づいて選択して注文します

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

あなたは通知を受け、最後の通知をするために、受信したとその後、クエリセットに注釈を付けている加入者を除外するためにexcludeクエリセットメソッドを使用することができます注文する。

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') 
関連する問題