Как сделать заказ по кверисету из другого поля модели?

class Item(models.Model):
    name = models.CharField(max_length=255)
    user = models.ForeignKey(User)

class Document(models.Model):
   doc_type = models.CharField(max_length=10, default="DOC")
   item = models.ForeignKey(Item, related_name="docs")
   uploaded_at = models.DateTimeField(auto_now_add=True)


@api_view(["GET"])
def get_items(request):
    # docs__uploaded_at should be from objects having doc_type="DOC" only
    # doc = Document.objects.filter(item=item, doc_type="DOC")
    items = Item.objects.prefetch_related("docs").filter(user=request.user).order_by("docs__uploaded_at")

Здесь я хочу упорядочить набор запросов элементов на основе поля документа uploaded_at, имеющего только doc_type="DOC".

Вы можете попробовать следующее.

items = Item.objects.prefetch_related("docs").filter(user=request.user).filter(docs__doc_type = "DOC").order_by("docs__uploaded_at")

Вы можете определить uploaded_at последний элемент с 'DOC' как doc_type:

from django.db.models import F, Max, Q
from django.db.models.functions import Coalesce


@api_view(['GET'])
def get_items(request):
    items = Item.objects.filter(user=request.user).alias(
        latest_upload=Coalesce(
            Max('docs__uploaded_at', filter=Q(docs__doc_type='DOC')),
            F('created_at')
        )
    ).order_by('-latest_upload')
    # …

Таким образом, мы определяем максимальный (последний) из docs__uploaded_at для docs с doc_type='DOC', а в случае отсутствия элемента (тогда Max(…) будет NULL), мы возвращаемся к полю created_at.


Note: is no longer supported [Django-doc] since April 2017, you should consider upgrading the Django version.

Вернуться на верх