Как сделать заказ по кверисету из другого поля модели?
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: django-1.9 is no longer supported [Django-doc] since April 2017, you should consider upgrading the Django version.