4👍
No, it’s not possible to combine them into a single query.
You can read the following blog post to find two workarounds.
33👍
Yes, it’s possible.
To get a queryset containing all Chapters which are the last in their Novels, simply do:
from django.db.models.expressions import F
from django.db.models.aggregates import Max
Chapters.objects.annotate(last_chapter_pk=Max('novel__chapter__pk')
).filter(pk=F('last_chapter_pk'))
Tested on Django 1.7.
- Django template tag: How to send next_page in {url auth_logout}?
- How does this Man-In-The-Middle attack work?
- Django render_to_string() ignores {% csrf_token %}
12👍
Possible with Django 3.2+
Make use of django.db.models.functions.JSONObject
(added in Django 3.2) to combine multiple fields (in this example, I’m fetching the latest object, however it is possible to fetch any arbitrary object provided that you can get LIMIT 1)
to yield your object):
MainModel.objects.annotate(
last_object=RelatedModel.objects.filter(mainmodel=OuterRef("pk"))
.order_by("-date_created")
.values(
data=JSONObject(
id="id", body="body", date_created="date_created"
)
)[:1]
)
- How to set timeout for urlfetch in Google App Engine?
- What is the right way to use angular2 http requests with Django CSRF protection?
- Apache strips down "Authorization" header
- TypeError: create_superuser() missing 1 required positional argument: 'profile_picture'
- Django AttributeError 'tuple' object has no attribute 'regex'
4👍
Yes, using Subqueries, docs: https://docs.djangoproject.com/en/3.0/ref/models/expressions/#subquery-expressions
latest_chapters = Chapter.objects.filter(novel = OuterRef("pk"))\
.order_by("chapter_order")
novels_with_chapter = Novel.objects.annotate(
latest_chapter = Subquery(latest_chapters.values("chapter")[:1]))
Tested on Django 3.0
The subquery creates a select statement inside the select statement for the novels, then adds this as an annotation. This means you only hit the database once.
I also prefer this to Rune’s answer as it actually annotates a Novel object.
Hope this helps, anyone who came looking like much later like I did.