簡體   English   中英

根據不同表中字段的條件對查詢集進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM