[英]Order queryset based on condition from fields in different table
我有一些用戶可以訂閱的資源,以獲得更多優勢。 我的挑戰是對它們進行排序,其中訂閱資源排在第一位,rest 緊隨其后。
最初,資源是這樣存儲的。
from django.db import models
from django.utils import timezone
class Entity(models.Model):
has_subscription = models.BooleanField()
created_at = models.DateTimeField(default=timezone.now)
# other fields
我會像這樣對它們進行排序,
Entity.objects.all().order_by("-has_subscription", "-created_at")
這有效。
我決定采用一種不同的存儲方式,這種方式有利於有時間限制的訂閱。 我想出了這個。
from django.db import models
from django.utils import timezone
class Entity(models.Model):
created_at = models.DateTimeField(default=timezone.now)
@property
def has_active_subscription(self):
if (
self.entity_subscriptions.filter(
start_date__lte=timezone.now(), end_date__gte=timezone.now()
).count()
> 0
):
return True
return False
class Subscriptions(model.Model):
entity = models.ForeignKey(
Entity,
on_delete=models.CASCADE,
related_name="entity_subscriptions",
related_query_name="entity_subscription",
)
start_date = models.DateTimeField()
end_date = models.DateTimeField()
如何以訂閱資源排在第一位的方式對查詢集進行排序。
經過大量搜索,以下解決方案對我有用。
from django.db.models import Case, When, Q
from django.utils import timezone
Entity.objects.annotate(
active_sub=Case(
When(
Q(
entity_subscription__start_date__lte=timezone.now(),
entity_subscription__end_date__gte=timezone.now(),
),
then=True,
),
default=False,
)
).order_by("-active_sub", "-created_at")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.