1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198 |
- ==========================
- ``QuerySet`` API reference
- ==========================
- .. currentmodule:: django.db.models.query
- This document describes the details of the ``QuerySet`` API. It builds on the
- material presented in the :doc:`model </topics/db/models>` and :doc:`database
- query </topics/db/queries>` guides, so you'll probably want to read and
- understand those documents before reading this one.
- Throughout this reference we'll use the :ref:`example blog models
- <queryset-model-example>` presented in the :doc:`database query guide
- </topics/db/queries>`.
- .. _when-querysets-are-evaluated:
- When ``QuerySet``\s are evaluated
- =================================
- Internally, a ``QuerySet`` can be constructed, filtered, sliced, and generally
- passed around without actually hitting the database. No database activity
- actually occurs until you do something to evaluate the queryset.
- You can evaluate a ``QuerySet`` in the following ways:
- * **Iteration.** A ``QuerySet`` is iterable, and it executes its database
- query the first time you iterate over it. For example, this will print
- the headline of all entries in the database::
- for e in Entry.objects.all():
- print(e.headline)
- Note: Don't use this if all you want to do is determine if at least one
- result exists. It's more efficient to use :meth:`~QuerySet.exists`.
- * **Asynchronous iteration.** A ``QuerySet`` can also be iterated over using
- ``async for``::
- async for e in Entry.objects.all():
- results.append(e)
- Both synchronous and asynchronous iterators of QuerySets share the same
- underlying cache.
- * **Slicing.** As explained in :ref:`limiting-querysets`, a ``QuerySet`` can
- be sliced, using Python's array-slicing syntax. Slicing an unevaluated
- ``QuerySet`` usually returns another unevaluated ``QuerySet``, but Django
- will execute the database query if you use the "step" parameter of slice
- syntax, and will return a list. Slicing a ``QuerySet`` that has been
- evaluated also returns a list.
- Also note that even though slicing an unevaluated ``QuerySet`` returns
- another unevaluated ``QuerySet``, modifying it further (e.g., adding
- more filters, or modifying ordering) is not allowed, since that does not
- translate well into SQL and it would not have a clear meaning either.
- * **Pickling/Caching.** See the following section for details of what
- is involved when `pickling QuerySets`_. The important thing for the
- purposes of this section is that the results are read from the database.
- * **repr().** A ``QuerySet`` is evaluated when you call ``repr()`` on it.
- This is for convenience in the Python interactive interpreter, so you can
- immediately see your results when using the API interactively.
- * **len().** A ``QuerySet`` is evaluated when you call ``len()`` on it.
- This, as you might expect, returns the length of the result list.
- Note: If you only need to determine the number of records in the set (and
- don't need the actual objects), it's much more efficient to handle a count
- at the database level using SQL's ``SELECT COUNT(*)``. Django provides a
- :meth:`~QuerySet.count` method for precisely this reason.
- * **list().** Force evaluation of a ``QuerySet`` by calling ``list()`` on
- it. For example::
- entry_list = list(Entry.objects.all())
- * **bool().** Testing a ``QuerySet`` in a boolean context, such as using
- ``bool()``, ``or``, ``and`` or an ``if`` statement, will cause the query
- to be executed. If there is at least one result, the ``QuerySet`` is
- ``True``, otherwise ``False``. For example::
- if Entry.objects.filter(headline="Test"):
- print("There is at least one Entry with the headline Test")
- Note: If you only want to determine if at least one result exists (and don't
- need the actual objects), it's more efficient to use :meth:`~QuerySet.exists`.
- .. _pickling QuerySets:
- Pickling ``QuerySet``\s
- -----------------------
- If you :mod:`pickle` a ``QuerySet``, this will force all the results to be loaded
- into memory prior to pickling. Pickling is usually used as a precursor to
- caching and when the cached queryset is reloaded, you want the results to
- already be present and ready for use (reading from the database can take some
- time, defeating the purpose of caching). This means that when you unpickle a
- ``QuerySet``, it contains the results at the moment it was pickled, rather
- than the results that are currently in the database.
- If you only want to pickle the necessary information to recreate the
- ``QuerySet`` from the database at a later time, pickle the ``query`` attribute
- of the ``QuerySet``. You can then recreate the original ``QuerySet`` (without
- any results loaded) using some code like this:
- .. code-block:: pycon
- >>> import pickle
- >>> query = pickle.loads(s) # Assuming 's' is the pickled string.
- >>> qs = MyModel.objects.all()
- >>> qs.query = query # Restore the original 'query'.
- The ``query`` attribute is an opaque object. It represents the internals of
- the query construction and is not part of the public API. However, it is safe
- (and fully supported) to pickle and unpickle the attribute's contents as
- described here.
- .. admonition:: Restrictions on ``QuerySet.values_list()``
- If you recreate :meth:`QuerySet.values_list` using the pickled ``query``
- attribute, it will be converted to :meth:`QuerySet.values`:
- .. code-block:: pycon
- >>> import pickle
- >>> qs = Blog.objects.values_list("id", "name")
- >>> qs
- <QuerySet [(1, 'Beatles Blog')]>
- >>> reloaded_qs = Blog.objects.all()
- >>> reloaded_qs.query = pickle.loads(pickle.dumps(qs.query))
- >>> reloaded_qs
- <QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
- .. admonition:: You can't share pickles between versions
- Pickles of ``QuerySets`` are only valid for the version of Django that
- was used to generate them. If you generate a pickle using Django
- version N, there is no guarantee that pickle will be readable with
- Django version N+1. Pickles should not be used as part of a long-term
- archival strategy.
- Since pickle compatibility errors can be difficult to diagnose, such as
- silently corrupted objects, a ``RuntimeWarning`` is raised when you try to
- unpickle a queryset in a Django version that is different than the one in
- which it was pickled.
- .. _queryset-api:
- ``QuerySet`` API
- ================
- Here's the formal declaration of a ``QuerySet``:
- .. class:: QuerySet(model=None, query=None, using=None, hints=None)
- Usually when you'll interact with a ``QuerySet`` you'll use it by
- :ref:`chaining filters <chaining-filters>`. To make this work, most
- ``QuerySet`` methods return new querysets. These methods are covered in
- detail later in this section.
- The ``QuerySet`` class has the following public attributes you can use for
- introspection:
- .. attribute:: ordered
- ``True`` if the ``QuerySet`` is ordered — i.e. has an
- :meth:`order_by()` clause or a default ordering on the model.
- ``False`` otherwise.
- .. attribute:: db
- The database that will be used if this query is executed now.
- .. note::
- The ``query`` parameter to :class:`QuerySet` exists so that specialized
- query subclasses can reconstruct internal query state. The value of the
- parameter is an opaque representation of that query state and is not
- part of a public API.
- .. currentmodule:: django.db.models.query.QuerySet
- Methods that return new ``QuerySet``\s
- --------------------------------------
- Django provides a range of ``QuerySet`` refinement methods that modify either
- the types of results returned by the ``QuerySet`` or the way its SQL query is
- executed.
- .. note::
- These methods do not run database queries, therefore they are **safe to**
- **run in asynchronous code**, and do not have separate asynchronous
- versions.
- ``filter()``
- ~~~~~~~~~~~~
- .. method:: filter(*args, **kwargs)
- Returns a new ``QuerySet`` containing objects that match the given lookup
- parameters.
- The lookup parameters (``**kwargs``) should be in the format described in
- `Field lookups`_ below. Multiple parameters are joined via ``AND`` in the
- underlying SQL statement.
- If you need to execute more complex queries (for example, queries with ``OR`` statements),
- you can use :class:`Q objects <django.db.models.Q>` (``*args``).
- ``exclude()``
- ~~~~~~~~~~~~~
- .. method:: exclude(*args, **kwargs)
- Returns a new ``QuerySet`` containing objects that do *not* match the given
- lookup parameters.
- The lookup parameters (``**kwargs``) should be in the format described in
- `Field lookups`_ below. Multiple parameters are joined via ``AND`` in the
- underlying SQL statement, and the whole thing is enclosed in a ``NOT()``.
- This example excludes all entries whose ``pub_date`` is later than 2005-1-3
- AND whose ``headline`` is "Hello"::
- Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline="Hello")
- In SQL terms, that evaluates to:
- .. code-block:: sql
- SELECT ...
- WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
- This example excludes all entries whose ``pub_date`` is later than 2005-1-3
- OR whose headline is "Hello"::
- Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline="Hello")
- In SQL terms, that evaluates to:
- .. code-block:: sql
- SELECT ...
- WHERE NOT pub_date > '2005-1-3'
- AND NOT headline = 'Hello'
- Note the second example is more restrictive.
- If you need to execute more complex queries (for example, queries with ``OR`` statements),
- you can use :class:`Q objects <django.db.models.Q>` (``*args``).
- ``annotate()``
- ~~~~~~~~~~~~~~
- .. method:: annotate(*args, **kwargs)
- Annotates each object in the ``QuerySet`` with the provided list of :doc:`query
- expressions </ref/models/expressions>`. An expression may be a simple value, a
- reference to a field on the model (or any related models), or an aggregate
- expression (averages, sums, etc.) that has been computed over the objects that
- are related to the objects in the ``QuerySet``.
- Each argument to ``annotate()`` is an annotation that will be added
- to each object in the ``QuerySet`` that is returned.
- The aggregation functions that are provided by Django are described
- in `Aggregation Functions`_ below.
- Annotations specified using keyword arguments will use the keyword as
- the alias for the annotation. Anonymous arguments will have an alias
- generated for them based upon the name of the aggregate function and
- the model field that is being aggregated. Only aggregate expressions
- that reference a single field can be anonymous arguments. Everything
- else must be a keyword argument.
- For example, if you were manipulating a list of blogs, you may want
- to determine how many entries have been made in each blog:
- .. code-block:: pycon
- >>> from django.db.models import Count
- >>> q = Blog.objects.annotate(Count("entry"))
- # The name of the first blog
- >>> q[0].name
- 'Blogasaurus'
- # The number of entries on the first blog
- >>> q[0].entry__count
- 42
- The ``Blog`` model doesn't define an ``entry__count`` attribute by itself,
- but by using a keyword argument to specify the aggregate function, you can
- control the name of the annotation:
- .. code-block:: pycon
- >>> q = Blog.objects.annotate(number_of_entries=Count("entry"))
- # The number of entries on the first blog, using the name provided
- >>> q[0].number_of_entries
- 42
- For an in-depth discussion of aggregation, see :doc:`the topic guide on
- Aggregation </topics/db/aggregation>`.
- ``alias()``
- ~~~~~~~~~~~
- .. method:: alias(*args, **kwargs)
- Same as :meth:`annotate`, but instead of annotating objects in the
- ``QuerySet``, saves the expression for later reuse with other ``QuerySet``
- methods. This is useful when the result of the expression itself is not needed
- but it is used for filtering, ordering, or as a part of a complex expression.
- Not selecting the unused value removes redundant work from the database which
- should result in better performance.
- For example, if you want to find blogs with more than 5 entries, but are not
- interested in the exact number of entries, you could do this:
- .. code-block:: pycon
- >>> from django.db.models import Count
- >>> blogs = Blog.objects.alias(entries=Count("entry")).filter(entries__gt=5)
- ``alias()`` can be used in conjunction with :meth:`annotate`, :meth:`exclude`,
- :meth:`filter`, :meth:`order_by`, and :meth:`update`. To use aliased expression
- with other methods (e.g. :meth:`aggregate`), you must promote it to an
- annotation::
- Blog.objects.alias(entries=Count("entry")).annotate(
- entries=F("entries"),
- ).aggregate(Sum("entries"))
- :meth:`filter` and :meth:`order_by` can take expressions directly, but
- expression construction and usage often does not happen in the same place (for
- example, ``QuerySet`` method creates expressions, for later use in views).
- ``alias()`` allows building complex expressions incrementally, possibly
- spanning multiple methods and modules, refer to the expression parts by their
- aliases and only use :meth:`annotate` for the final result.
- ``order_by()``
- ~~~~~~~~~~~~~~
- .. method:: order_by(*fields)
- By default, results returned by a ``QuerySet`` are ordered by the ordering
- tuple given by the ``ordering`` option in the model's ``Meta``. You can
- override this on a per-``QuerySet`` basis by using the ``order_by`` method.
- Example::
- Entry.objects.filter(pub_date__year=2005).order_by("-pub_date", "headline")
- The result above will be ordered by ``pub_date`` descending, then by
- ``headline`` ascending. The negative sign in front of ``"-pub_date"`` indicates
- *descending* order. Ascending order is implied. To order randomly, use ``"?"``,
- like so::
- Entry.objects.order_by("?")
- Note: ``order_by('?')`` queries may be expensive and slow, depending on the
- database backend you're using.
- To order by a field in a different model, use the same syntax as when you are
- querying across model relations. That is, the name of the field, followed by a
- double underscore (``__``), followed by the name of the field in the new model,
- and so on for as many models as you want to join. For example::
- Entry.objects.order_by("blog__name", "headline")
- If you try to order by a field that is a relation to another model, Django will
- use the default ordering on the related model, or order by the related model's
- primary key if there is no :attr:`Meta.ordering
- <django.db.models.Options.ordering>` specified. For example, since the ``Blog``
- model has no default ordering specified::
- Entry.objects.order_by("blog")
- ...is identical to::
- Entry.objects.order_by("blog__id")
- If ``Blog`` had ``ordering = ['name']``, then the first queryset would be
- identical to::
- Entry.objects.order_by("blog__name")
- You can also order by :doc:`query expressions </ref/models/expressions>` by
- calling :meth:`~.Expression.asc` or :meth:`~.Expression.desc` on the
- expression::
- Entry.objects.order_by(Coalesce("summary", "headline").desc())
- :meth:`~.Expression.asc` and :meth:`~.Expression.desc` have arguments
- (``nulls_first`` and ``nulls_last``) that control how null values are sorted.
- Be cautious when ordering by fields in related models if you are also using
- :meth:`distinct()`. See the note in :meth:`distinct` for an explanation of how
- related model ordering can change the expected results.
- .. note::
- It is permissible to specify a multi-valued field to order the results by
- (for example, a :class:`~django.db.models.ManyToManyField` field, or the
- reverse relation of a :class:`~django.db.models.ForeignKey` field).
- Consider this case::
- class Event(Model):
- parent = models.ForeignKey(
- "self",
- on_delete=models.CASCADE,
- related_name="children",
- )
- date = models.DateField()
- Event.objects.order_by("children__date")
- Here, there could potentially be multiple ordering data for each ``Event``;
- each ``Event`` with multiple ``children`` will be returned multiple times
- into the new ``QuerySet`` that ``order_by()`` creates. In other words,
- using ``order_by()`` on the ``QuerySet`` could return more items than you
- were working on to begin with - which is probably neither expected nor
- useful.
- Thus, take care when using multi-valued field to order the results. **If**
- you can be sure that there will only be one ordering piece of data for each
- of the items you're ordering, this approach should not present problems. If
- not, make sure the results are what you expect.
- There's no way to specify whether ordering should be case sensitive. With
- respect to case-sensitivity, Django will order results however your database
- backend normally orders them.
- You can order by a field converted to lowercase with
- :class:`~django.db.models.functions.Lower` which will achieve case-consistent
- ordering::
- Entry.objects.order_by(Lower("headline").desc())
- If you don't want any ordering to be applied to a query, not even the default
- ordering, call :meth:`order_by()` with no parameters.
- You can tell if a query is ordered or not by checking the
- :attr:`.QuerySet.ordered` attribute, which will be ``True`` if the
- ``QuerySet`` has been ordered in any way.
- Each ``order_by()`` call will clear any previous ordering. For example, this
- query will be ordered by ``pub_date`` and not ``headline``::
- Entry.objects.order_by("headline").order_by("pub_date")
- .. warning::
- Ordering is not a free operation. Each field you add to the ordering
- incurs a cost to your database. Each foreign key you add will
- implicitly include all of its default orderings as well.
- If a query doesn't have an ordering specified, results are returned from
- the database in an unspecified order. A particular ordering is guaranteed
- only when ordering by a set of fields that uniquely identify each object in
- the results. For example, if a ``name`` field isn't unique, ordering by it
- won't guarantee objects with the same name always appear in the same order.
- ``reverse()``
- ~~~~~~~~~~~~~
- .. method:: reverse()
- Use the ``reverse()`` method to reverse the order in which a queryset's
- elements are returned. Calling ``reverse()`` a second time restores the
- ordering back to the normal direction.
- To retrieve the "last" five items in a queryset, you could do this::
- my_queryset.reverse()[:5]
- Note that this is not quite the same as slicing from the end of a sequence in
- Python. The above example will return the last item first, then the
- penultimate item and so on. If we had a Python sequence and looked at
- ``seq[-5:]``, we would see the fifth-last item first. Django doesn't support
- that mode of access (slicing from the end), because it's not possible to do it
- efficiently in SQL.
- Also, note that ``reverse()`` should generally only be called on a ``QuerySet``
- which has a defined ordering (e.g., when querying against a model which defines
- a default ordering, or when using :meth:`order_by()`). If no such ordering is
- defined for a given ``QuerySet``, calling ``reverse()`` on it has no real
- effect (the ordering was undefined prior to calling ``reverse()``, and will
- remain undefined afterward).
- ``distinct()``
- ~~~~~~~~~~~~~~
- .. method:: distinct(*fields)
- Returns a new ``QuerySet`` that uses ``SELECT DISTINCT`` in its SQL query. This
- eliminates duplicate rows from the query results.
- By default, a ``QuerySet`` will not eliminate duplicate rows. In practice, this
- is rarely a problem, because simple queries such as ``Blog.objects.all()``
- don't introduce the possibility of duplicate result rows. However, if your
- query spans multiple tables, it's possible to get duplicate results when a
- ``QuerySet`` is evaluated. That's when you'd use ``distinct()``.
- .. note::
- Any fields used in an :meth:`order_by` call are included in the SQL
- ``SELECT`` columns. This can sometimes lead to unexpected results when used
- in conjunction with ``distinct()``. If you order by fields from a related
- model, those fields will be added to the selected columns and they may make
- otherwise duplicate rows appear to be distinct. Since the extra columns
- don't appear in the returned results (they are only there to support
- ordering), it sometimes looks like non-distinct results are being returned.
- Similarly, if you use a :meth:`values()` query to restrict the columns
- selected, the columns used in any :meth:`order_by()` (or default model
- ordering) will still be involved and may affect uniqueness of the results.
- The moral here is that if you are using ``distinct()`` be careful about
- ordering by related models. Similarly, when using ``distinct()`` and
- :meth:`values()` together, be careful when ordering by fields not in the
- :meth:`values()` call.
- On PostgreSQL only, you can pass positional arguments (``*fields``) in order to
- specify the names of fields to which the ``DISTINCT`` should apply. This
- translates to a ``SELECT DISTINCT ON`` SQL query. Here's the difference. For a
- normal ``distinct()`` call, the database compares *each* field in each row when
- determining which rows are distinct. For a ``distinct()`` call with specified
- field names, the database will only compare the specified field names.
- .. note::
- When you specify field names, you *must* provide an ``order_by()`` in the
- ``QuerySet``, and the fields in ``order_by()`` must start with the fields in
- ``distinct()``, in the same order.
- For example, ``SELECT DISTINCT ON (a)`` gives you the first row for each
- value in column ``a``. If you don't specify an order, you'll get some
- arbitrary row.
- Examples (those after the first will only work on PostgreSQL):
- .. code-block:: pycon
- >>> Author.objects.distinct()
- [...]
- >>> Entry.objects.order_by("pub_date").distinct("pub_date")
- [...]
- >>> Entry.objects.order_by("blog").distinct("blog")
- [...]
- >>> Entry.objects.order_by("author", "pub_date").distinct("author", "pub_date")
- [...]
- >>> Entry.objects.order_by("blog__name", "mod_date").distinct("blog__name", "mod_date")
- [...]
- >>> Entry.objects.order_by("author", "pub_date").distinct("author")
- [...]
- .. note::
- Keep in mind that :meth:`order_by` uses any default related model ordering
- that has been defined. You might have to explicitly order by the relation
- ``_id`` or referenced field to make sure the ``DISTINCT ON`` expressions
- match those at the beginning of the ``ORDER BY`` clause. For example, if
- the ``Blog`` model defined an :attr:`~django.db.models.Options.ordering` by
- ``name``::
- Entry.objects.order_by("blog").distinct("blog")
- ...wouldn't work because the query would be ordered by ``blog__name`` thus
- mismatching the ``DISTINCT ON`` expression. You'd have to explicitly order
- by the relation ``_id`` field (``blog_id`` in this case) or the referenced
- one (``blog__pk``) to make sure both expressions match.
- ``values()``
- ~~~~~~~~~~~~
- .. method:: values(*fields, **expressions)
- Returns a ``QuerySet`` that returns dictionaries, rather than model instances,
- when used as an iterable.
- Each of those dictionaries represents an object, with the keys corresponding to
- the attribute names of model objects.
- This example compares the dictionaries of ``values()`` with the normal model
- objects:
- .. code-block:: pycon
- # This list contains a Blog object.
- >>> Blog.objects.filter(name__startswith="Beatles")
- <QuerySet [<Blog: Beatles Blog>]>
- # This list contains a dictionary.
- >>> Blog.objects.filter(name__startswith="Beatles").values()
- <QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
- The ``values()`` method takes optional positional arguments, ``*fields``, which
- specify field names to which the ``SELECT`` should be limited. If you specify
- the fields, each dictionary will contain only the field keys/values for the
- fields you specify. If you don't specify the fields, each dictionary will
- contain a key and value for every field in the database table.
- Example:
- .. code-block:: pycon
- >>> Blog.objects.values()
- <QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
- >>> Blog.objects.values("id", "name")
- <QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
- The ``values()`` method also takes optional keyword arguments,
- ``**expressions``, which are passed through to :meth:`annotate`:
- .. code-block:: pycon
- >>> from django.db.models.functions import Lower
- >>> Blog.objects.values(lower_name=Lower("name"))
- <QuerySet [{'lower_name': 'beatles blog'}]>
- You can use built-in and :doc:`custom lookups </howto/custom-lookups>` in
- ordering. For example:
- .. code-block:: pycon
- >>> from django.db.models import CharField
- >>> from django.db.models.functions import Lower
- >>> CharField.register_lookup(Lower)
- >>> Blog.objects.values("name__lower")
- <QuerySet [{'name__lower': 'beatles blog'}]>
- An aggregate within a ``values()`` clause is applied before other arguments
- within the same ``values()`` clause. If you need to group by another value,
- add it to an earlier ``values()`` clause instead. For example:
- .. code-block:: pycon
- >>> from django.db.models import Count
- >>> Blog.objects.values("entry__authors", entries=Count("entry"))
- <QuerySet [{'entry__authors': 1, 'entries': 20}, {'entry__authors': 1, 'entries': 13}]>
- >>> Blog.objects.values("entry__authors").annotate(entries=Count("entry"))
- <QuerySet [{'entry__authors': 1, 'entries': 33}]>
- A few subtleties that are worth mentioning:
- * If you have a field called ``foo`` that is a
- :class:`~django.db.models.ForeignKey`, the default ``values()`` call
- will return a dictionary key called ``foo_id``, since this is the name
- of the hidden model attribute that stores the actual value (the ``foo``
- attribute refers to the related model). When you are calling
- ``values()`` and passing in field names, you can pass in either ``foo``
- or ``foo_id`` and you will get back the same thing (the dictionary key
- will match the field name you passed in).
- For example:
- .. code-block:: pycon
- >>> Entry.objects.values()
- <QuerySet [{'blog_id': 1, 'headline': 'First Entry', ...}, ...]>
- >>> Entry.objects.values("blog")
- <QuerySet [{'blog': 1}, ...]>
- >>> Entry.objects.values("blog_id")
- <QuerySet [{'blog_id': 1}, ...]>
- * When using ``values()`` together with :meth:`distinct()`, be aware that
- ordering can affect the results. See the note in :meth:`distinct` for
- details.
- * If you use a ``values()`` clause after an :meth:`extra()` call,
- any fields defined by a ``select`` argument in the :meth:`extra()` must
- be explicitly included in the ``values()`` call. Any :meth:`extra()` call
- made after a ``values()`` call will have its extra selected fields
- ignored.
- * Calling :meth:`only()` and :meth:`defer()` after ``values()`` doesn't make
- sense, so doing so will raise a ``TypeError``.
- * Combining transforms and aggregates requires the use of two :meth:`annotate`
- calls, either explicitly or as keyword arguments to :meth:`values`. As above,
- if the transform has been registered on the relevant field type the first
- :meth:`annotate` can be omitted, thus the following examples are equivalent:
- .. code-block:: pycon
- >>> from django.db.models import CharField, Count
- >>> from django.db.models.functions import Lower
- >>> CharField.register_lookup(Lower)
- >>> Blog.objects.values("entry__authors__name__lower").annotate(entries=Count("entry"))
- <QuerySet [{'entry__authors__name__lower': 'test author', 'entries': 33}]>
- >>> Blog.objects.values(entry__authors__name__lower=Lower("entry__authors__name")).annotate(
- ... entries=Count("entry")
- ... )
- <QuerySet [{'entry__authors__name__lower': 'test author', 'entries': 33}]>
- >>> Blog.objects.annotate(entry__authors__name__lower=Lower("entry__authors__name")).values(
- ... "entry__authors__name__lower"
- ... ).annotate(entries=Count("entry"))
- <QuerySet [{'entry__authors__name__lower': 'test author', 'entries': 33}]>
- It is useful when you know you're only going to need values from a small number
- of the available fields and you won't need the functionality of a model
- instance object. It's more efficient to select only the fields you need to use.
- Finally, note that you can call ``filter()``, ``order_by()``, etc. after the
- ``values()`` call, that means that these two calls are identical::
- Blog.objects.values().order_by("id")
- Blog.objects.order_by("id").values()
- The people who made Django prefer to put all the SQL-affecting methods first,
- followed (optionally) by any output-affecting methods (such as ``values()``),
- but it doesn't really matter. This is your chance to really flaunt your
- individualism.
- You can also refer to fields on related models with reverse relations through
- ``OneToOneField``, ``ForeignKey`` and ``ManyToManyField`` attributes:
- .. code-block:: pycon
- >>> Blog.objects.values("name", "entry__headline")
- <QuerySet [{'name': 'My blog', 'entry__headline': 'An entry'},
- {'name': 'My blog', 'entry__headline': 'Another entry'}, ...]>
- .. warning::
- Because :class:`~django.db.models.ManyToManyField` attributes and reverse
- relations can have multiple related rows, including these can have a
- multiplier effect on the size of your result set. This will be especially
- pronounced if you include multiple such fields in your ``values()`` query,
- in which case all possible combinations will be returned.
- .. admonition:: Special values for ``JSONField`` on SQLite
- Due to the way the ``JSON_EXTRACT`` and ``JSON_TYPE`` SQL functions are
- implemented on SQLite, and lack of the ``BOOLEAN`` data type,
- ``values()`` will return ``True``, ``False``, and ``None`` instead of
- ``"true"``, ``"false"``, and ``"null"`` strings for
- :class:`~django.db.models.JSONField` key transforms.
- .. versionchanged:: 5.2
- The ``SELECT`` clause generated when using ``values()`` was updated to
- respect the order of the specified ``*fields`` and ``**expressions``.
- ``values_list()``
- ~~~~~~~~~~~~~~~~~
- .. method:: values_list(*fields, flat=False, named=False)
- This is similar to ``values()`` except that instead of returning dictionaries,
- it returns tuples when iterated over. Each tuple contains the value from the
- respective field or expression passed into the ``values_list()`` call — so the
- first item is the first field, etc. For example:
- .. code-block:: pycon
- >>> Entry.objects.values_list("id", "headline")
- <QuerySet [(1, 'First entry'), ...]>
- >>> from django.db.models.functions import Lower
- >>> Entry.objects.values_list("id", Lower("headline"))
- <QuerySet [(1, 'first entry'), ...]>
- If you only pass in a single field, you can also pass in the ``flat``
- parameter. If ``True``, this will mean the returned results are single values,
- rather than 1-tuples. An example should make the difference clearer:
- .. code-block:: pycon
- >>> Entry.objects.values_list("id").order_by("id")
- <QuerySet[(1,), (2,), (3,), ...]>
- >>> Entry.objects.values_list("id", flat=True).order_by("id")
- <QuerySet [1, 2, 3, ...]>
- It is an error to pass in ``flat`` when there is more than one field.
- You can pass ``named=True`` to get results as a
- :func:`~python:collections.namedtuple`:
- .. code-block:: pycon
- >>> Entry.objects.values_list("id", "headline", named=True)
- <QuerySet [Row(id=1, headline='First entry'), ...]>
- Using a named tuple may make use of the results more readable, at the expense
- of a small performance penalty for transforming the results into a named tuple.
- If you don't pass any values to ``values_list()``, it will return all the
- fields in the model, in the order they were declared.
- A common need is to get a specific field value of a certain model instance. To
- achieve that, use ``values_list()`` followed by a ``get()`` call:
- .. code-block:: pycon
- >>> Entry.objects.values_list("headline", flat=True).get(pk=1)
- 'First entry'
- ``values()`` and ``values_list()`` are both intended as optimizations for a
- specific use case: retrieving a subset of data without the overhead of creating
- a model instance. This metaphor falls apart when dealing with many-to-many and
- other multivalued relations (such as the one-to-many relation of a reverse
- foreign key) because the "one row, one object" assumption doesn't hold.
- For example, notice the behavior when querying across a
- :class:`~django.db.models.ManyToManyField`:
- .. code-block:: pycon
- >>> Author.objects.values_list("name", "entry__headline")
- <QuerySet [('Noam Chomsky', 'Impressions of Gaza'),
- ('George Orwell', 'Why Socialists Do Not Believe in Fun'),
- ('George Orwell', 'In Defence of English Cooking'),
- ('Don Quixote', None)]>
- Authors with multiple entries appear multiple times and authors without any
- entries have ``None`` for the entry headline.
- Similarly, when querying a reverse foreign key, ``None`` appears for entries
- not having any author:
- .. code-block:: pycon
- >>> Entry.objects.values_list("authors")
- <QuerySet [('Noam Chomsky',), ('George Orwell',), (None,)]>
- .. admonition:: Special values for ``JSONField`` on SQLite
- Due to the way the ``JSON_EXTRACT`` and ``JSON_TYPE`` SQL functions are
- implemented on SQLite, and lack of the ``BOOLEAN`` data type,
- ``values_list()`` will return ``True``, ``False``, and ``None`` instead of
- ``"true"``, ``"false"``, and ``"null"`` strings for
- :class:`~django.db.models.JSONField` key transforms.
- .. versionchanged:: 5.2
- The ``SELECT`` clause generated when using ``values_list()`` was updated to
- respect the order of the specified ``*fields``.
- ``dates()``
- ~~~~~~~~~~~
- .. method:: dates(field, kind, order='ASC')
- Returns a ``QuerySet`` that evaluates to a list of :class:`datetime.date`
- objects representing all available dates of a particular kind within the
- contents of the ``QuerySet``.
- ``field`` should be the name of a ``DateField`` of your model.
- ``kind`` should be either ``"year"``, ``"month"``, ``"week"``, or ``"day"``.
- Each :class:`datetime.date` object in the result list is "truncated" to the
- given ``type``.
- * ``"year"`` returns a list of all distinct year values for the field.
- * ``"month"`` returns a list of all distinct year/month values for the
- field.
- * ``"week"`` returns a list of all distinct year/week values for the field. All
- dates will be a Monday.
- * ``"day"`` returns a list of all distinct year/month/day values for the
- field.
- ``order``, which defaults to ``'ASC'``, should be either ``'ASC'`` or
- ``'DESC'``. This specifies how to order the results.
- Examples:
- .. code-block:: pycon
- >>> Entry.objects.dates("pub_date", "year")
- [datetime.date(2005, 1, 1)]
- >>> Entry.objects.dates("pub_date", "month")
- [datetime.date(2005, 2, 1), datetime.date(2005, 3, 1)]
- >>> Entry.objects.dates("pub_date", "week")
- [datetime.date(2005, 2, 14), datetime.date(2005, 3, 14)]
- >>> Entry.objects.dates("pub_date", "day")
- [datetime.date(2005, 2, 20), datetime.date(2005, 3, 20)]
- >>> Entry.objects.dates("pub_date", "day", order="DESC")
- [datetime.date(2005, 3, 20), datetime.date(2005, 2, 20)]
- >>> Entry.objects.filter(headline__contains="Lennon").dates("pub_date", "day")
- [datetime.date(2005, 3, 20)]
- ``datetimes()``
- ~~~~~~~~~~~~~~~
- .. method:: datetimes(field_name, kind, order='ASC', tzinfo=None)
- Returns a ``QuerySet`` that evaluates to a list of :class:`datetime.datetime`
- objects representing all available dates of a particular kind within the
- contents of the ``QuerySet``.
- ``field_name`` should be the name of a ``DateTimeField`` of your model.
- ``kind`` should be either ``"year"``, ``"month"``, ``"week"``, ``"day"``,
- ``"hour"``, ``"minute"``, or ``"second"``. Each :class:`datetime.datetime`
- object in the result list is "truncated" to the given ``type``.
- ``order``, which defaults to ``'ASC'``, should be either ``'ASC'`` or
- ``'DESC'``. This specifies how to order the results.
- ``tzinfo`` defines the time zone to which datetimes are converted prior to
- truncation. Indeed, a given datetime has different representations depending
- on the time zone in use. This parameter must be a :class:`datetime.tzinfo`
- object. If it's ``None``, Django uses the :ref:`current time zone
- <default-current-time-zone>`. It has no effect when :setting:`USE_TZ` is
- ``False``.
- .. _database-time-zone-definitions:
- .. note::
- This function performs time zone conversions directly in the database.
- As a consequence, your database must be able to interpret the value of
- ``tzinfo.tzname(None)``. This translates into the following requirements:
- - SQLite: no requirements. Conversions are performed in Python.
- - PostgreSQL: no requirements (see `Time Zones`_).
- - Oracle: no requirements (see `Choosing a Time Zone File`_).
- - MySQL: load the time zone tables with `mysql_tzinfo_to_sql`_.
- .. _Time Zones: https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-TIMEZONES
- .. _Choosing a Time Zone File: https://docs.oracle.com/en/database/oracle/
- oracle-database/18/nlspg/datetime-data-types-and-time-zone-support.html
- #GUID-805AB986-DE12-4FEA-AF56-5AABCD2132DF
- .. _mysql_tzinfo_to_sql: https://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html
- ``none()``
- ~~~~~~~~~~
- .. method:: none()
- Calling ``none()`` will create a queryset that never returns any objects and no
- query will be executed when accessing the results. A ``qs.none()`` queryset
- is an instance of ``EmptyQuerySet``.
- Examples:
- .. code-block:: pycon
- >>> Entry.objects.none()
- <QuerySet []>
- >>> from django.db.models.query import EmptyQuerySet
- >>> isinstance(Entry.objects.none(), EmptyQuerySet)
- True
- ``all()``
- ~~~~~~~~~
- .. method:: all()
- Returns a *copy* of the current ``QuerySet`` (or ``QuerySet`` subclass). This
- can be useful in situations where you might want to pass in either a model
- manager or a ``QuerySet`` and do further filtering on the result. After calling
- ``all()`` on either object, you'll definitely have a ``QuerySet`` to work with.
- When a ``QuerySet`` is :ref:`evaluated <when-querysets-are-evaluated>`, it
- typically caches its results. If the data in the database might have changed
- since a ``QuerySet`` was evaluated, you can get updated results for the same
- query by calling ``all()`` on a previously evaluated ``QuerySet``.
- ``union()``
- ~~~~~~~~~~~
- .. method:: union(*other_qs, all=False)
- Uses SQL's ``UNION`` operator to combine the results of two or more
- ``QuerySet``\s. For example:
- >>> qs1.union(qs2, qs3)
- The ``UNION`` operator selects only distinct values by default. To allow
- duplicate values, use the ``all=True`` argument.
- ``union()``, ``intersection()``, and ``difference()`` return model instances
- of the type of the first ``QuerySet`` even if the arguments are ``QuerySet``\s
- of other models. Passing different models works as long as the ``SELECT`` list
- is the same in all ``QuerySet``\s (at least the types, the names don't matter
- as long as the types are in the same order). In such cases, you must use the
- column names from the first ``QuerySet`` in ``QuerySet`` methods applied to the
- resulting ``QuerySet``. For example:
- .. code-block:: pycon
- >>> qs1 = Author.objects.values_list("name")
- >>> qs2 = Entry.objects.values_list("headline")
- >>> qs1.union(qs2).order_by("name")
- In addition, only ``LIMIT``, ``OFFSET``, ``COUNT(*)``, ``ORDER BY``, and
- specifying columns (i.e. slicing, :meth:`count`, :meth:`exists`,
- :meth:`order_by`, and :meth:`values()`/:meth:`values_list()`) are allowed
- on the resulting ``QuerySet``. Further, databases place restrictions on
- what operations are allowed in the combined queries. For example, most
- databases don't allow ``LIMIT`` or ``OFFSET`` in the combined queries.
- ``intersection()``
- ~~~~~~~~~~~~~~~~~~
- .. method:: intersection(*other_qs)
- Uses SQL's ``INTERSECT`` operator to return the shared elements of two or more
- ``QuerySet``\s. For example:
- .. code-block:: pycon
- >>> qs1.intersection(qs2, qs3)
- See :meth:`union` for some restrictions.
- ``difference()``
- ~~~~~~~~~~~~~~~~
- .. method:: difference(*other_qs)
- Uses SQL's ``EXCEPT`` operator to keep only elements present in the
- ``QuerySet`` but not in some other ``QuerySet``\s. For example:
- .. code-block:: pycon
- >>> qs1.difference(qs2, qs3)
- See :meth:`union` for some restrictions.
- ``select_related()``
- ~~~~~~~~~~~~~~~~~~~~
- .. method:: select_related(*fields)
- Returns a ``QuerySet`` that will "follow" foreign-key relationships, selecting
- additional related-object data when it executes its query. This is a
- performance booster which results in a single more complex query but means
- later use of foreign-key relationships won't require database queries.
- The following examples illustrate the difference between plain lookups and
- ``select_related()`` lookups. Here's standard lookup::
- # Hits the database.
- e = Entry.objects.get(id=5)
- # Hits the database again to get the related Blog object.
- b = e.blog
- And here's ``select_related`` lookup::
- # Hits the database.
- e = Entry.objects.select_related("blog").get(id=5)
- # Doesn't hit the database, because e.blog has been prepopulated
- # in the previous query.
- b = e.blog
- You can use ``select_related()`` with any queryset of objects::
- from django.utils import timezone
- # Find all the blogs with entries scheduled to be published in the future.
- blogs = set()
- for e in Entry.objects.filter(pub_date__gt=timezone.now()).select_related("blog"):
- # Without select_related(), this would make a database query for each
- # loop iteration in order to fetch the related blog for each entry.
- blogs.add(e.blog)
- The order of ``filter()`` and ``select_related()`` chaining isn't important.
- These querysets are equivalent::
- Entry.objects.filter(pub_date__gt=timezone.now()).select_related("blog")
- Entry.objects.select_related("blog").filter(pub_date__gt=timezone.now())
- You can follow foreign keys in a similar way to querying them. If you have the
- following models::
- from django.db import models
- class City(models.Model):
- # ...
- pass
- class Person(models.Model):
- # ...
- hometown = models.ForeignKey(
- City,
- on_delete=models.SET_NULL,
- blank=True,
- null=True,
- )
- class Book(models.Model):
- # ...
- author = models.ForeignKey(Person, on_delete=models.CASCADE)
- ... then a call to ``Book.objects.select_related('author__hometown').get(id=4)``
- will cache the related ``Person`` *and* the related ``City``::
- # Hits the database with joins to the author and hometown tables.
- b = Book.objects.select_related("author__hometown").get(id=4)
- p = b.author # Doesn't hit the database.
- c = p.hometown # Doesn't hit the database.
- # Without select_related()...
- b = Book.objects.get(id=4) # Hits the database.
- p = b.author # Hits the database.
- c = p.hometown # Hits the database.
- You can refer to any :class:`~django.db.models.ForeignKey` or
- :class:`~django.db.models.OneToOneField` relation in the list of fields
- passed to ``select_related()``.
- You can also refer to the reverse direction of a
- :class:`~django.db.models.OneToOneField` in the list of fields passed to
- ``select_related`` — that is, you can traverse a
- :class:`~django.db.models.OneToOneField` back to the object on which the field
- is defined. Instead of specifying the field name, use the :attr:`related_name
- <django.db.models.ForeignKey.related_name>` for the field on the related object.
- There may be some situations where you wish to call ``select_related()`` with a
- lot of related objects, or where you don't know all of the relations. In these
- cases it is possible to call ``select_related()`` with no arguments. This will
- follow all non-null foreign keys it can find - nullable foreign keys must be
- specified. This is not recommended in most cases as it is likely to make the
- underlying query more complex, and return more data, than is actually needed.
- If you need to clear the list of related fields added by past calls of
- ``select_related`` on a ``QuerySet``, you can pass ``None`` as a parameter:
- .. code-block:: pycon
- >>> without_relations = queryset.select_related(None)
- Chaining ``select_related`` calls works in a similar way to other methods -
- that is that ``select_related('foo', 'bar')`` is equivalent to
- ``select_related('foo').select_related('bar')``.
- ``prefetch_related()``
- ~~~~~~~~~~~~~~~~~~~~~~
- .. method:: prefetch_related(*lookups)
- Returns a ``QuerySet`` that will automatically retrieve, in a single batch,
- related objects for each of the specified lookups.
- This has a similar purpose to ``select_related``, in that both are designed to
- stop the deluge of database queries that is caused by accessing related objects,
- but the strategy is quite different.
- ``select_related`` works by creating an SQL join and including the fields of the
- related object in the ``SELECT`` statement. For this reason, ``select_related``
- gets the related objects in the same database query. However, to avoid the much
- larger result set that would result from joining across a 'many' relationship,
- ``select_related`` is limited to single-valued relationships - foreign key and
- one-to-one.
- ``prefetch_related``, on the other hand, does a separate lookup for each
- relationship, and does the 'joining' in Python. This allows it to prefetch
- many-to-many, many-to-one, and
- :class:`~django.contrib.contenttypes.fields.GenericRelation` objects which
- cannot be done using ``select_related``, in addition to the foreign key and
- one-to-one relationships that are supported by ``select_related``. It also
- supports prefetching of
- :class:`~django.contrib.contenttypes.fields.GenericForeignKey`, however, the
- queryset for each ``ContentType`` must be provided in the ``querysets``
- parameter of :class:`~django.contrib.contenttypes.prefetch.GenericPrefetch`.
- For example, suppose you have these models::
- from django.db import models
- class Topping(models.Model):
- name = models.CharField(max_length=30)
- class Pizza(models.Model):
- name = models.CharField(max_length=50)
- toppings = models.ManyToManyField(Topping)
- def __str__(self):
- return "%s (%s)" % (
- self.name,
- ", ".join(topping.name for topping in self.toppings.all()),
- )
- and run:
- .. code-block:: pycon
- >>> Pizza.objects.all()
- ["Hawaiian (ham, pineapple)", "Seafood (prawns, smoked salmon)"...
- The problem with this is that every time ``Pizza.__str__()`` asks for
- ``self.toppings.all()`` it has to query the database, so
- ``Pizza.objects.all()`` will run a query on the Toppings table for **every**
- item in the Pizza ``QuerySet``.
- We can reduce to just two queries using ``prefetch_related``:
- .. code-block:: pycon
- >>> Pizza.objects.prefetch_related("toppings")
- This implies a ``self.toppings.all()`` for each ``Pizza``; now each time
- ``self.toppings.all()`` is called, instead of having to go to the database for
- the items, it will find them in a prefetched ``QuerySet`` cache that was
- populated in a single query.
- That is, all the relevant toppings will have been fetched in a single query,
- and used to make ``QuerySets`` that have a pre-filled cache of the relevant
- results; these ``QuerySets`` are then used in the ``self.toppings.all()`` calls.
- The additional queries in ``prefetch_related()`` are executed after the
- ``QuerySet`` has begun to be evaluated and the primary query has been executed.
- Note that there is no mechanism to prevent another database query from altering
- the items in between the execution of the primary query and the additional
- queries, which could produce an inconsistent result. For example, if a
- ``Pizza`` is deleted after the primary query has executed, its toppings will
- not be returned in the additional query, and it will seem like the pizza has no
- toppings:
- .. code-block:: pycon
- >>> Pizza.objects.prefetch_related("toppings")
- # "Hawaiian" Pizza was deleted in another shell.
- <QuerySet [<Pizza: Hawaiian ()>, <Pizza: Seafood (prawns, smoked salmon)>]>
- If you have an iterable of model instances, you can prefetch related attributes
- on those instances using the :func:`~django.db.models.prefetch_related_objects`
- function.
- Note that the result cache of the primary ``QuerySet`` and all specified related
- objects will then be fully loaded into memory. This changes the typical
- behavior of ``QuerySets``, which normally try to avoid loading all objects into
- memory before they are needed, even after a query has been executed in the
- database.
- .. note::
- Remember that, as always with ``QuerySets``, any subsequent chained methods
- which imply a different database query will ignore previously cached
- results, and retrieve data using a fresh database query. So, if you write
- the following:
- .. code-block:: pycon
- >>> pizzas = Pizza.objects.prefetch_related("toppings")
- >>> [list(pizza.toppings.filter(spicy=True)) for pizza in pizzas]
- ...then the fact that ``pizza.toppings.all()`` has been prefetched will not
- help you. The ``prefetch_related('toppings')`` implied
- ``pizza.toppings.all()``, but ``pizza.toppings.filter()`` is a new and
- different query. The prefetched cache can't help here; in fact it hurts
- performance, since you have done a database query that you haven't used. So
- use this feature with caution!
- Also, if you call the database-altering methods
- :meth:`~django.db.models.fields.related.RelatedManager.add`,
- :meth:`~django.db.models.fields.related.RelatedManager.create`,
- :meth:`~django.db.models.fields.related.RelatedManager.remove`,
- :meth:`~django.db.models.fields.related.RelatedManager.clear` or
- :meth:`~django.db.models.fields.related.RelatedManager.set`, on
- :class:`related managers<django.db.models.fields.related.RelatedManager>`,
- any prefetched cache for the relation will be cleared.
- You can also use the normal join syntax to do related fields of related
- fields. Suppose we have an additional model to the example above::
- class Restaurant(models.Model):
- pizzas = models.ManyToManyField(Pizza, related_name="restaurants")
- best_pizza = models.ForeignKey(
- Pizza, related_name="championed_by", on_delete=models.CASCADE
- )
- The following are all legal:
- .. code-block:: pycon
- >>> Restaurant.objects.prefetch_related("pizzas__toppings")
- This will prefetch all pizzas belonging to restaurants, and all toppings
- belonging to those pizzas. This will result in a total of 3 database queries -
- one for the restaurants, one for the pizzas, and one for the toppings.
- .. code-block:: pycon
- >>> Restaurant.objects.prefetch_related("best_pizza__toppings")
- This will fetch the best pizza and all the toppings for the best pizza for each
- restaurant. This will be done in 3 database queries - one for the restaurants,
- one for the 'best pizzas', and one for the toppings.
- The ``best_pizza`` relationship could also be fetched using ``select_related``
- to reduce the query count to 2:
- .. code-block:: pycon
- >>> Restaurant.objects.select_related("best_pizza").prefetch_related("best_pizza__toppings")
- Since the prefetch is executed after the main query (which includes the joins
- needed by ``select_related``), it is able to detect that the ``best_pizza``
- objects have already been fetched, and it will skip fetching them again.
- Chaining ``prefetch_related`` calls will accumulate the lookups that are
- prefetched. To clear any ``prefetch_related`` behavior, pass ``None`` as a
- parameter:
- .. code-block:: pycon
- >>> non_prefetched = qs.prefetch_related(None)
- One difference to note when using ``prefetch_related`` is that objects created
- by a query can be shared between the different objects that they are related to
- i.e. a single Python model instance can appear at more than one point in the
- tree of objects that are returned. This will normally happen with foreign key
- relationships. Typically this behavior will not be a problem, and will in fact
- save both memory and CPU time.
- While ``prefetch_related`` supports prefetching ``GenericForeignKey``
- relationships, the number of queries will depend on the data. Since a
- ``GenericForeignKey`` can reference data in multiple tables, one query per table
- referenced is needed, rather than one query for all the items. There could be
- additional queries on the ``ContentType`` table if the relevant rows have not
- already been fetched.
- ``prefetch_related`` in most cases will be implemented using an SQL query that
- uses the 'IN' operator. This means that for a large ``QuerySet`` a large 'IN' clause
- could be generated, which, depending on the database, might have performance
- problems of its own when it comes to parsing or executing the SQL query. Always
- profile for your use case!
- If you use ``iterator()`` to run the query, ``prefetch_related()`` calls will
- only be observed if a value for ``chunk_size`` is provided.
- You can use the :class:`~django.db.models.Prefetch` object to further control
- the prefetch operation.
- In its simplest form ``Prefetch`` is equivalent to the traditional string based
- lookups:
- .. code-block:: pycon
- >>> from django.db.models import Prefetch
- >>> Restaurant.objects.prefetch_related(Prefetch("pizzas__toppings"))
- You can provide a custom queryset with the optional ``queryset`` argument.
- This can be used to change the default ordering of the queryset:
- .. code-block:: pycon
- >>> Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas__toppings", queryset=Toppings.objects.order_by("name"))
- ... )
- Or to call :meth:`~django.db.models.query.QuerySet.select_related()` when
- applicable to reduce the number of queries even further:
- .. code-block:: pycon
- >>> Pizza.objects.prefetch_related(
- ... Prefetch("restaurants", queryset=Restaurant.objects.select_related("best_pizza"))
- ... )
- You can also assign the prefetched result to a custom attribute with the optional
- ``to_attr`` argument. The result will be stored directly in a list.
- This allows prefetching the same relation multiple times with a different
- ``QuerySet``; for instance:
- .. code-block:: pycon
- >>> vegetarian_pizzas = Pizza.objects.filter(vegetarian=True)
- >>> Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas", to_attr="menu"),
- ... Prefetch("pizzas", queryset=vegetarian_pizzas, to_attr="vegetarian_menu"),
- ... )
- Lookups created with custom ``to_attr`` can still be traversed as usual by other
- lookups:
- .. code-block:: pycon
- >>> vegetarian_pizzas = Pizza.objects.filter(vegetarian=True)
- >>> Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas", queryset=vegetarian_pizzas, to_attr="vegetarian_menu"),
- ... "vegetarian_menu__toppings",
- ... )
- Using ``to_attr`` is recommended when filtering down the prefetch result as it is
- less ambiguous than storing a filtered result in the related manager's cache:
- .. code-block:: pycon
- >>> queryset = Pizza.objects.filter(vegetarian=True)
- >>>
- >>> # Recommended:
- >>> restaurants = Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas", queryset=queryset, to_attr="vegetarian_pizzas")
- ... )
- >>> vegetarian_pizzas = restaurants[0].vegetarian_pizzas
- >>>
- >>> # Not recommended:
- >>> restaurants = Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas", queryset=queryset),
- ... )
- >>> vegetarian_pizzas = restaurants[0].pizzas.all()
- Custom prefetching also works with single related relations like
- forward ``ForeignKey`` or ``OneToOneField``. Generally you'll want to use
- :meth:`select_related()` for these relations, but there are a number of cases
- where prefetching with a custom ``QuerySet`` is useful:
- * You want to use a ``QuerySet`` that performs further prefetching
- on related models.
- * You want to prefetch only a subset of the related objects.
- * You want to use performance optimization techniques like
- :meth:`deferred fields <defer()>`:
- .. code-block:: pycon
- >>> queryset = Pizza.objects.only("name")
- >>>
- >>> restaurants = Restaurant.objects.prefetch_related(
- ... Prefetch("best_pizza", queryset=queryset)
- ... )
- When using multiple databases, ``Prefetch`` will respect your choice of
- database. If the inner query does not specify a database, it will use the
- database selected by the outer query. All of the following are valid:
- .. code-block:: pycon
- >>> # Both inner and outer queries will use the 'replica' database
- >>> Restaurant.objects.prefetch_related("pizzas__toppings").using("replica")
- >>> Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas__toppings"),
- ... ).using("replica")
- >>>
- >>> # Inner will use the 'replica' database; outer will use 'default' database
- >>> Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas__toppings", queryset=Toppings.objects.using("replica")),
- ... )
- >>>
- >>> # Inner will use 'replica' database; outer will use 'cold-storage' database
- >>> Restaurant.objects.prefetch_related(
- ... Prefetch("pizzas__toppings", queryset=Toppings.objects.using("replica")),
- ... ).using("cold-storage")
- .. note::
- The ordering of lookups matters.
- Take the following examples:
- .. code-block:: pycon
- >>> prefetch_related("pizzas__toppings", "pizzas")
- This works even though it's unordered because ``'pizzas__toppings'``
- already contains all the needed information, therefore the second argument
- ``'pizzas'`` is actually redundant.
- .. code-block:: pycon
- >>> prefetch_related("pizzas__toppings", Prefetch("pizzas", queryset=Pizza.objects.all()))
- This will raise a ``ValueError`` because of the attempt to redefine the
- queryset of a previously seen lookup. Note that an implicit queryset was
- created to traverse ``'pizzas'`` as part of the ``'pizzas__toppings'``
- lookup.
- .. code-block:: pycon
- >>> prefetch_related("pizza_list__toppings", Prefetch("pizzas", to_attr="pizza_list"))
- This will trigger an ``AttributeError`` because ``'pizza_list'`` doesn't exist yet
- when ``'pizza_list__toppings'`` is being processed.
- This consideration is not limited to the use of ``Prefetch`` objects. Some
- advanced techniques may require that the lookups be performed in a
- specific order to avoid creating extra queries; therefore it's recommended
- to always carefully order ``prefetch_related`` arguments.
- ``extra()``
- ~~~~~~~~~~~
- .. method:: extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
- Sometimes, the Django query syntax by itself can't easily express a complex
- ``WHERE`` clause. For these edge cases, Django provides the ``extra()``
- ``QuerySet`` modifier — a hook for injecting specific clauses into the SQL
- generated by a ``QuerySet``.
- .. admonition:: Use this method as a last resort
- This is an old API that we aim to deprecate at some point in the future.
- Use it only if you cannot express your query using other queryset methods.
- If you do need to use it, please `file a ticket
- <https://code.djangoproject.com/newticket>`_ using the `QuerySet.extra
- keyword <https://code.djangoproject.com/query?status=assigned&status=new&keywords=~QuerySet.extra>`_
- with your use case (please check the list of existing tickets first) so
- that we can enhance the QuerySet API to allow removing ``extra()``. We are
- no longer improving or fixing bugs for this method.
- For example, this use of ``extra()``:
- .. code-block:: pycon
- >>> qs.extra(
- ... select={"val": "select col from sometable where othercol = %s"},
- ... select_params=(someparam,),
- ... )
- is equivalent to:
- .. code-block:: pycon
- >>> qs.annotate(val=RawSQL("select col from sometable where othercol = %s", (someparam,)))
- The main benefit of using :class:`~django.db.models.expressions.RawSQL` is
- that you can set ``output_field`` if needed. The main downside is that if
- you refer to some table alias of the queryset in the raw SQL, then it is
- possible that Django might change that alias (for example, when the
- queryset is used as a subquery in yet another query).
- .. warning::
- You should be very careful whenever you use ``extra()``. Every time you use
- it, you should escape any parameters that the user can control by using
- ``params`` in order to protect against SQL injection attacks.
- You also must not quote placeholders in the SQL string. This example is
- vulnerable to SQL injection because of the quotes around ``%s``:
- .. code-block:: sql
- SELECT col FROM sometable WHERE othercol = '%s' # unsafe!
- You can read more about how Django's :ref:`SQL injection protection
- <sql-injection-protection>` works.
- By definition, these extra lookups may not be portable to different database
- engines (because you're explicitly writing SQL code) and violate the DRY
- principle, so you should avoid them if possible.
- Specify one or more of ``params``, ``select``, ``where`` or ``tables``. None
- of the arguments is required, but you should use at least one of them.
- * ``select``
- The ``select`` argument lets you put extra fields in the ``SELECT``
- clause. It should be a dictionary mapping attribute names to SQL
- clauses to use to calculate that attribute.
- Example::
- Entry.objects.extra(select={"is_recent": "pub_date > '2006-01-01'"})
- As a result, each ``Entry`` object will have an extra attribute,
- ``is_recent``, a boolean representing whether the entry's ``pub_date``
- is greater than Jan. 1, 2006.
- Django inserts the given SQL snippet directly into the ``SELECT``
- statement, so the resulting SQL of the above example would be something like:
- .. code-block:: sql
- SELECT blog_entry.*, (pub_date > '2006-01-01') AS is_recent
- FROM blog_entry;
- The next example is more advanced; it does a subquery to give each
- resulting ``Blog`` object an ``entry_count`` attribute, an integer count
- of associated ``Entry`` objects::
- Blog.objects.extra(
- select={
- "entry_count": "SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id"
- },
- )
- In this particular case, we're exploiting the fact that the query will
- already contain the ``blog_blog`` table in its ``FROM`` clause.
- The resulting SQL of the above example would be:
- .. code-block:: sql
- SELECT blog_blog.*, (SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id) AS entry_count
- FROM blog_blog;
- Note that the parentheses required by most database engines around
- subqueries are not required in Django's ``select`` clauses.
- In some rare cases, you might wish to pass parameters to the SQL
- fragments in ``extra(select=...)``. For this purpose, use the
- ``select_params`` parameter.
- This will work, for example::
- Blog.objects.extra(
- select={"a": "%s", "b": "%s"},
- select_params=("one", "two"),
- )
- If you need to use a literal ``%s`` inside your select string, use
- the sequence ``%%s``.
- * ``where`` / ``tables``
- You can define explicit SQL ``WHERE`` clauses — perhaps to perform
- non-explicit joins — by using ``where``. You can manually add tables to
- the SQL ``FROM`` clause by using ``tables``.
- ``where`` and ``tables`` both take a list of strings. All ``where``
- parameters are "AND"ed to any other search criteria.
- Example::
- Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
- ...translates (roughly) into the following SQL:
- .. code-block:: sql
- SELECT * FROM blog_entry WHERE (foo='a' OR bar='a') AND (baz='a')
- Be careful when using the ``tables`` parameter if you're specifying
- tables that are already used in the query. When you add extra tables
- via the ``tables`` parameter, Django assumes you want that table
- included an extra time, if it is already included. That creates a
- problem, since the table name will then be given an alias. If a table
- appears multiple times in an SQL statement, the second and subsequent
- occurrences must use aliases so the database can tell them apart. If
- you're referring to the extra table you added in the extra ``where``
- parameter this is going to cause errors.
- Normally you'll only be adding extra tables that don't already appear
- in the query. However, if the case outlined above does occur, there are
- a few solutions. First, see if you can get by without including the
- extra table and use the one already in the query. If that isn't
- possible, put your ``extra()`` call at the front of the queryset
- construction so that your table is the first use of that table.
- Finally, if all else fails, look at the query produced and rewrite your
- ``where`` addition to use the alias given to your extra table. The
- alias will be the same each time you construct the queryset in the same
- way, so you can rely upon the alias name to not change.
- * ``order_by``
- If you need to order the resulting queryset using some of the new
- fields or tables you have included via ``extra()`` use the ``order_by``
- parameter to ``extra()`` and pass in a sequence of strings. These
- strings should either be model fields (as in the normal
- :meth:`order_by()` method on querysets), of the form
- ``table_name.column_name`` or an alias for a column that you specified
- in the ``select`` parameter to ``extra()``.
- For example::
- q = Entry.objects.extra(select={"is_recent": "pub_date > '2006-01-01'"})
- q = q.extra(order_by=["-is_recent"])
- This would sort all the items for which ``is_recent`` is true to the
- front of the result set (``True`` sorts before ``False`` in a
- descending ordering).
- This shows, by the way, that you can make multiple calls to ``extra()``
- and it will behave as you expect (adding new constraints each time).
- * ``params``
- The ``where`` parameter described above may use standard Python
- database string placeholders — ``'%s'`` to indicate parameters the
- database engine should automatically quote. The ``params`` argument is
- a list of any extra parameters to be substituted.
- Example::
- Entry.objects.extra(where=["headline=%s"], params=["Lennon"])
- Always use ``params`` instead of embedding values directly into
- ``where`` because ``params`` will ensure values are quoted correctly
- according to your particular backend. For example, quotes will be
- escaped correctly.
- Bad::
- Entry.objects.extra(where=["headline='Lennon'"])
- Good::
- Entry.objects.extra(where=["headline=%s"], params=["Lennon"])
- .. warning::
- If you are performing queries on MySQL, note that MySQL's silent type coercion
- may cause unexpected results when mixing types. If you query on a string
- type column, but with an integer value, MySQL will coerce the types of all values
- in the table to an integer before performing the comparison. For example, if your
- table contains the values ``'abc'``, ``'def'`` and you query for ``WHERE mycolumn=0``,
- both rows will match. To prevent this, perform the correct typecasting
- before using the value in a query.
- ``defer()``
- ~~~~~~~~~~~
- .. method:: defer(*fields)
- In some complex data-modeling situations, your models might contain a lot of
- fields, some of which could contain a lot of data (for example, text fields),
- or require expensive processing to convert them to Python objects. If you are
- using the results of a queryset in some situation where you don't know
- if you need those particular fields when you initially fetch the data, you can
- tell Django not to retrieve them from the database.
- This is done by passing the names of the fields to not load to ``defer()``::
- Entry.objects.defer("headline", "body")
- A queryset that has deferred fields will still return model instances. Each
- deferred field will be retrieved from the database if you access that field
- (one at a time, not all the deferred fields at once).
- .. note::
- Deferred fields will not lazy-load like this from asynchronous code.
- Instead, you will get a ``SynchronousOnlyOperation`` exception. If you are
- writing asynchronous code, you should not try to access any fields that you
- ``defer()``.
- You can make multiple calls to ``defer()``. Each call adds new fields to the
- deferred set::
- # Defers both the body and headline fields.
- Entry.objects.defer("body").filter(rating=5).defer("headline")
- The order in which fields are added to the deferred set does not matter.
- Calling ``defer()`` with a field name that has already been deferred is
- harmless (the field will still be deferred).
- You can defer loading of fields in related models (if the related models are
- loading via :meth:`select_related()`) by using the standard double-underscore
- notation to separate related fields::
- Blog.objects.select_related().defer("entry__headline", "entry__body")
- If you want to clear the set of deferred fields, pass ``None`` as a parameter
- to ``defer()``::
- # Load all fields immediately.
- my_queryset.defer(None)
- Some fields in a model won't be deferred, even if you ask for them. You can
- never defer the loading of the primary key. If you are using
- :meth:`select_related()` to retrieve related models, you shouldn't defer the
- loading of the field that connects from the primary model to the related
- one, doing so will result in an error.
- Similarly, calling ``defer()`` (or its counterpart :meth:`only()`) including an
- argument from an aggregation (e.g. using the result of :meth:`annotate()`)
- doesn't make sense: doing so will raise an exception. The aggregated values
- will always be fetched into the resulting queryset.
- .. note::
- The ``defer()`` method (and its cousin, :meth:`only()`, below) are only for
- advanced use-cases. They provide an optimization for when you have analyzed
- your queries closely and understand *exactly* what information you need and
- have measured that the difference between returning the fields you need and
- the full set of fields for the model will be significant.
- Even if you think you are in the advanced use-case situation, **only use**
- ``defer()`` **when you cannot, at queryset load time, determine if you will
- need the extra fields or not**. If you are frequently loading and using a
- particular subset of your data, the best choice you can make is to
- normalize your models and put the non-loaded data into a separate model
- (and database table). If the columns *must* stay in the one table for some
- reason, create a model with ``Meta.managed = False`` (see the
- :attr:`managed attribute <django.db.models.Options.managed>` documentation)
- containing just the fields you normally need to load and use that where you
- might otherwise call ``defer()``. This makes your code more explicit to the
- reader, is slightly faster and consumes a little less memory in the Python
- process.
- For example, both of these models use the same underlying database table::
- class CommonlyUsedModel(models.Model):
- f1 = models.CharField(max_length=10)
- class Meta:
- managed = False
- db_table = "app_largetable"
- class ManagedModel(models.Model):
- f1 = models.CharField(max_length=10)
- f2 = models.CharField(max_length=10)
- class Meta:
- db_table = "app_largetable"
- # Two equivalent QuerySets:
- CommonlyUsedModel.objects.all()
- ManagedModel.objects.defer("f2")
- If many fields need to be duplicated in the unmanaged model, it may be best
- to create an abstract model with the shared fields and then have the
- unmanaged and managed models inherit from the abstract model.
- .. note::
- When calling :meth:`~django.db.models.Model.save()` for instances with
- deferred fields, only the loaded fields will be saved. See
- :meth:`~django.db.models.Model.save()` for more details.
- ``only()``
- ~~~~~~~~~~
- .. method:: only(*fields)
- The ``only()`` method is essentially the opposite of :meth:`defer`. Only the
- fields passed into this method and that are *not* already specified as deferred
- are loaded immediately when the queryset is evaluated.
- If you have a model where almost all the fields need to be deferred, using
- ``only()`` to specify the complementary set of fields can result in simpler
- code.
- Suppose you have a model with fields ``name``, ``age`` and ``biography``. The
- following two querysets are the same, in terms of deferred fields::
- Person.objects.defer("age", "biography")
- Person.objects.only("name")
- Whenever you call ``only()`` it *replaces* the set of fields to load
- immediately. The method's name is mnemonic: **only** those fields are loaded
- immediately; the remainder are deferred. Thus, successive calls to ``only()``
- result in only the final fields being considered::
- # This will defer all fields except the headline.
- Entry.objects.only("body", "rating").only("headline")
- Since ``defer()`` acts incrementally (adding fields to the deferred list), you
- can combine calls to ``only()`` and ``defer()`` and things will behave
- logically::
- # Final result is that everything except "headline" is deferred.
- Entry.objects.only("headline", "body").defer("body")
- # Final result loads headline immediately.
- Entry.objects.defer("body").only("headline", "body")
- All of the cautions in the note for the :meth:`defer` documentation apply to
- ``only()`` as well. Use it cautiously and only after exhausting your other
- options.
- Using ``only()`` and omitting a field requested using :meth:`select_related` is
- an error as well. On the other hand, invoking ``only()`` without any arguments,
- will return every field (including annotations) fetched by the queryset.
- As with ``defer()``, you cannot access the non-loaded fields from asynchronous
- code and expect them to load. Instead, you will get a
- ``SynchronousOnlyOperation`` exception. Ensure that all fields you might access
- are in your ``only()`` call.
- .. note::
- When calling :meth:`~django.db.models.Model.save()` for instances with
- deferred fields, only the loaded fields will be saved. See
- :meth:`~django.db.models.Model.save()` for more details.
- .. note::
- When using :meth:`defer` after ``only()`` the fields in :meth:`defer` will
- override ``only()`` for fields that are listed in both.
- ``using()``
- ~~~~~~~~~~~
- .. method:: using(alias)
- This method is for controlling which database the ``QuerySet`` will be
- evaluated against if you are using more than one database. The only argument
- this method takes is the alias of a database, as defined in
- :setting:`DATABASES`.
- For example:
- .. code-block:: pycon
- # queries the database with the 'default' alias.
- >>> Entry.objects.all()
- # queries the database with the 'backup' alias
- >>> Entry.objects.using("backup")
- ``select_for_update()``
- ~~~~~~~~~~~~~~~~~~~~~~~
- .. method:: select_for_update(nowait=False, skip_locked=False, of=(), no_key=False)
- Returns a queryset that will lock rows until the end of the transaction,
- generating a ``SELECT ... FOR UPDATE`` SQL statement on supported databases.
- For example::
- from django.db import transaction
- entries = Entry.objects.select_for_update().filter(author=request.user)
- with transaction.atomic():
- for entry in entries:
- ...
- When the queryset is evaluated (``for entry in entries`` in this case), all
- matched entries will be locked until the end of the transaction block, meaning
- that other transactions will be prevented from changing or acquiring locks on
- them.
- Usually, if another transaction has already acquired a lock on one of the
- selected rows, the query will block until the lock is released. If this is
- not the behavior you want, call ``select_for_update(nowait=True)``. This will
- make the call non-blocking. If a conflicting lock is already acquired by
- another transaction, :exc:`~django.db.DatabaseError` will be raised when the
- queryset is evaluated. You can also ignore locked rows by using
- ``select_for_update(skip_locked=True)`` instead. The ``nowait`` and
- ``skip_locked`` are mutually exclusive and attempts to call
- ``select_for_update()`` with both options enabled will result in a
- :exc:`ValueError`.
- By default, ``select_for_update()`` locks all rows that are selected by the
- query. For example, rows of related objects specified in :meth:`select_related`
- are locked in addition to rows of the queryset's model. If this isn't desired,
- specify the related objects you want to lock in ``select_for_update(of=(...))``
- using the same fields syntax as :meth:`select_related`. Use the value ``'self'``
- to refer to the queryset's model.
- .. admonition:: Lock parents models in ``select_for_update(of=(...))``
- If you want to lock parents models when using :ref:`multi-table inheritance
- <multi-table-inheritance>`, you must specify parent link fields (by default
- ``<parent_model_name>_ptr``) in the ``of`` argument. For example::
- Restaurant.objects.select_for_update(of=("self", "place_ptr"))
- .. admonition:: Using ``select_for_update(of=(...))`` with specified fields
- If you want to lock models and specify selected fields, e.g. using
- :meth:`values`, you must select at least one field from each model in the
- ``of`` argument. Models without selected fields will not be locked.
- On PostgreSQL only, you can pass ``no_key=True`` in order to acquire a weaker
- lock, that still allows creating rows that merely reference locked rows
- (through a foreign key, for example) while the lock is in place. The
- PostgreSQL documentation has more details about `row-level lock modes
- <https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-ROWS>`_.
- You can't use ``select_for_update()`` on nullable relations:
- .. code-block:: pycon
- >>> Person.objects.select_related("hometown").select_for_update()
- Traceback (most recent call last):
- ...
- django.db.utils.NotSupportedError: FOR UPDATE cannot be applied to the nullable side of an outer join
- To avoid that restriction, you can exclude null objects if you don't care about
- them:
- .. code-block:: pycon
- >>> Person.objects.select_related("hometown").select_for_update().exclude(hometown=None)
- <QuerySet [<Person: ...)>, ...]>
- The ``postgresql``, ``oracle``, and ``mysql`` database backends support
- ``select_for_update()``. However, MariaDB only supports the ``nowait``
- argument, MariaDB 10.6+ also supports the ``skip_locked`` argument, and MySQL
- supports the ``nowait``, ``skip_locked``, and ``of`` arguments. The ``no_key``
- argument is only supported on PostgreSQL.
- Passing ``nowait=True``, ``skip_locked=True``, ``no_key=True``, or ``of`` to
- ``select_for_update()`` using database backends that do not support these
- options, such as MySQL, raises a :exc:`~django.db.NotSupportedError`. This
- prevents code from unexpectedly blocking.
- Evaluating a queryset with ``select_for_update()`` in autocommit mode on
- backends which support ``SELECT ... FOR UPDATE`` is a
- :exc:`~django.db.transaction.TransactionManagementError` error because the
- rows are not locked in that case. If allowed, this would facilitate data
- corruption and could easily be caused by calling code that expects to be run in
- a transaction outside of one.
- Using ``select_for_update()`` on backends which do not support
- ``SELECT ... FOR UPDATE`` (such as SQLite) will have no effect.
- ``SELECT ... FOR UPDATE`` will not be added to the query, and an error isn't
- raised if ``select_for_update()`` is used in autocommit mode.
- .. warning::
- Although ``select_for_update()`` normally fails in autocommit mode, since
- :class:`~django.test.TestCase` automatically wraps each test in a
- transaction, calling ``select_for_update()`` in a ``TestCase`` even outside
- an :func:`~django.db.transaction.atomic()` block will (perhaps unexpectedly)
- pass without raising a ``TransactionManagementError``. To properly test
- ``select_for_update()`` you should use
- :class:`~django.test.TransactionTestCase`.
- .. admonition:: Certain expressions may not be supported
- PostgreSQL doesn't support ``select_for_update()`` with
- :class:`~django.db.models.expressions.Window` expressions.
- ``raw()``
- ~~~~~~~~~
- .. method:: raw(raw_query, params=(), translations=None, using=None)
- Takes a raw SQL query, executes it, and returns a
- ``django.db.models.query.RawQuerySet`` instance. This ``RawQuerySet`` instance
- can be iterated over just like a normal ``QuerySet`` to provide object
- instances.
- See the :doc:`/topics/db/sql` for more information.
- .. warning::
- ``raw()`` always triggers a new query and doesn't account for previous
- filtering. As such, it should generally be called from the ``Manager`` or
- from a fresh ``QuerySet`` instance.
- Operators that return new ``QuerySet``\s
- ----------------------------------------
- Combined querysets must use the same model.
- AND (``&``)
- ~~~~~~~~~~~
- Combines two ``QuerySet``\s using the SQL ``AND`` operator in a manner similar
- to chaining filters.
- The following are equivalent::
- Model.objects.filter(x=1) & Model.objects.filter(y=2)
- Model.objects.filter(x=1).filter(y=2)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE x=1 AND y=2
- OR (``|``)
- ~~~~~~~~~~
- Combines two ``QuerySet``\s using the SQL ``OR`` operator.
- The following are equivalent::
- Model.objects.filter(x=1) | Model.objects.filter(y=2)
- from django.db.models import Q
- Model.objects.filter(Q(x=1) | Q(y=2))
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE x=1 OR y=2
- ``|`` is not a commutative operation, as different (though equivalent) queries
- may be generated.
- XOR (``^``)
- ~~~~~~~~~~~
- Combines two ``QuerySet``\s using the SQL ``XOR`` operator. A ``XOR``
- expression matches rows that are matched by an odd number of operands.
- The following are equivalent::
- Model.objects.filter(x=1) ^ Model.objects.filter(y=2)
- from django.db.models import Q
- Model.objects.filter(Q(x=1) ^ Q(y=2))
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE x=1 XOR y=2
- .. note::
- ``XOR`` is natively supported on MariaDB and MySQL. On other databases,
- ``x ^ y ^ ... ^ z`` is converted to an equivalent:
- .. code-block:: sql
- (x OR y OR ... OR z) AND
- 1=MOD(
- (CASE WHEN x THEN 1 ELSE 0 END) +
- (CASE WHEN y THEN 1 ELSE 0 END) +
- ...
- (CASE WHEN z THEN 1 ELSE 0 END),
- 2
- )
- Methods that do not return ``QuerySet``\s
- -----------------------------------------
- The following ``QuerySet`` methods evaluate the ``QuerySet`` and return
- something *other than* a ``QuerySet``.
- These methods do not use a cache (see :ref:`caching-and-querysets`). Rather,
- they query the database each time they're called.
- Because these methods evaluate the QuerySet, they are blocking calls, and so
- their main (synchronous) versions cannot be called from asynchronous code. For
- this reason, each has a corresponding asynchronous version with an ``a`` prefix
- - for example, rather than ``get(…)`` you can ``await aget(…)``.
- There is usually no difference in behavior apart from their asynchronous
- nature, but any differences are noted below next to each method.
- ``get()``
- ~~~~~~~~~
- .. method:: get(*args, **kwargs)
- .. method:: aget(*args, **kwargs)
- *Asynchronous version*: ``aget()``
- Returns the object matching the given lookup parameters, which should be in
- the format described in `Field lookups`_. You should use lookups that are
- guaranteed unique, such as the primary key or fields in a unique constraint.
- For example::
- Entry.objects.get(id=1)
- Entry.objects.get(Q(blog=blog) & Q(entry_number=1))
- If you expect a queryset to already return one row, you can use ``get()``
- without any arguments to return the object for that row::
- Entry.objects.filter(pk=1).get()
- If ``get()`` doesn't find any object, it raises a :exc:`Model.DoesNotExist
- <django.db.models.Model.DoesNotExist>` exception::
- Entry.objects.get(id=-999) # raises Entry.DoesNotExist
- If ``get()`` finds more than one object, it raises a
- :exc:`Model.MultipleObjectsReturned
- <django.db.models.Model.MultipleObjectsReturned>` exception::
- Entry.objects.get(name="A Duplicated Name") # raises Entry.MultipleObjectsReturned
- Both these exception classes are attributes of the model class, and specific to
- that model. If you want to handle such exceptions from several ``get()`` calls
- for different models, you can use their generic base classes. For example, you
- can use :exc:`django.core.exceptions.ObjectDoesNotExist` to handle
- :exc:`~django.db.models.Model.DoesNotExist` exceptions from multiple models::
- from django.core.exceptions import ObjectDoesNotExist
- try:
- blog = Blog.objects.get(id=1)
- entry = Entry.objects.get(blog=blog, entry_number=1)
- except ObjectDoesNotExist:
- print("Either the blog or entry doesn't exist.")
- ``create()``
- ~~~~~~~~~~~~
- .. method:: create(**kwargs)
- .. method:: acreate(**kwargs)
- *Asynchronous version*: ``acreate()``
- A convenience method for creating an object and saving it all in one step. Thus::
- p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
- and::
- p = Person(first_name="Bruce", last_name="Springsteen")
- p.save(force_insert=True)
- are equivalent.
- The :ref:`force_insert <ref-models-force-insert>` parameter is documented
- elsewhere, but all it means is that a new object will always be created.
- Normally you won't need to worry about this. However, if your model contains a
- manual primary key value that you set and if that value already exists in the
- database, a call to ``create()`` will fail with an
- :exc:`~django.db.IntegrityError` since primary keys must be unique. Be
- prepared to handle the exception if you are using manual primary keys.
- ``get_or_create()``
- ~~~~~~~~~~~~~~~~~~~
- .. method:: get_or_create(defaults=None, **kwargs)
- .. method:: aget_or_create(defaults=None, **kwargs)
- *Asynchronous version*: ``aget_or_create()``
- A convenience method for looking up an object with the given ``kwargs`` (may be
- empty if your model has defaults for all fields), creating one if necessary.
- Returns a tuple of ``(object, created)``, where ``object`` is the retrieved or
- created object and ``created`` is a boolean specifying whether a new object was
- created.
- This is meant to prevent duplicate objects from being created when requests are
- made in parallel, and as a shortcut to boilerplatish code. For example::
- try:
- obj = Person.objects.get(first_name="John", last_name="Lennon")
- except Person.DoesNotExist:
- obj = Person(first_name="John", last_name="Lennon", birthday=date(1940, 10, 9))
- obj.save()
- Here, with concurrent requests, multiple attempts to save a ``Person`` with
- the same parameters may be made. To avoid this race condition, the above
- example can be rewritten using ``get_or_create()`` like so::
- obj, created = Person.objects.get_or_create(
- first_name="John",
- last_name="Lennon",
- defaults={"birthday": date(1940, 10, 9)},
- )
- Any keyword arguments passed to ``get_or_create()`` — *except* an optional one
- called ``defaults`` — will be used in a :meth:`get()` call. If an object is
- found, ``get_or_create()`` returns a tuple of that object and ``False``.
- .. warning::
- This method is atomic assuming that the database enforces uniqueness of the
- keyword arguments (see :attr:`~django.db.models.Field.unique` or
- :attr:`~django.db.models.Options.unique_together`). If the fields used in the
- keyword arguments do not have a uniqueness constraint, concurrent calls to
- this method may result in multiple rows with the same parameters being
- inserted.
- You can specify more complex conditions for the retrieved object by chaining
- ``get_or_create()`` with ``filter()`` and using :class:`Q objects
- <django.db.models.Q>`. For example, to retrieve Robert or Bob Marley if either
- exists, and create the latter otherwise::
- from django.db.models import Q
- obj, created = Person.objects.filter(
- Q(first_name="Bob") | Q(first_name="Robert"),
- ).get_or_create(last_name="Marley", defaults={"first_name": "Bob"})
- If multiple objects are found, ``get_or_create()`` raises
- :exc:`~django.core.exceptions.MultipleObjectsReturned`. If an object is *not*
- found, ``get_or_create()`` will instantiate and save a new object, returning a
- tuple of the new object and ``True``. The new object will be created roughly
- according to this algorithm::
- params = {k: v for k, v in kwargs.items() if "__" not in k}
- params.update({k: v() if callable(v) else v for k, v in defaults.items()})
- obj = self.model(**params)
- obj.save()
- In English, that means start with any non-``'defaults'`` keyword argument that
- doesn't contain a double underscore (which would indicate a non-exact lookup).
- Then add the contents of ``defaults``, overriding any keys if necessary, and
- use the result as the keyword arguments to the model class. If there are any
- callables in ``defaults``, evaluate them. As hinted at above, this is a
- simplification of the algorithm that is used, but it contains all the pertinent
- details. The internal implementation has some more error-checking than this and
- handles some extra edge-conditions; if you're interested, read the code.
- If you have a field named ``defaults`` and want to use it as an exact lookup in
- ``get_or_create()``, use ``'defaults__exact'``, like so::
- Foo.objects.get_or_create(defaults__exact="bar", defaults={"defaults": "baz"})
- The ``get_or_create()`` method has similar error behavior to :meth:`create()`
- when you're using manually specified primary keys. If an object needs to be
- created and the key already exists in the database, an
- :exc:`~django.db.IntegrityError` will be raised.
- Finally, a word on using ``get_or_create()`` in Django views. Please make sure
- to use it only in ``POST`` requests unless you have a good reason not to.
- ``GET`` requests shouldn't have any effect on data. Instead, use ``POST``
- whenever a request to a page has a side effect on your data. For more, see
- :rfc:`Safe methods <9110#section-9.2.1>` in the HTTP spec.
- .. warning::
- You can use ``get_or_create()`` through :class:`~django.db.models.ManyToManyField`
- attributes and reverse relations. In that case you will restrict the queries
- inside the context of that relation. That could lead you to some integrity
- problems if you don't use it consistently.
- Being the following models::
- class Chapter(models.Model):
- title = models.CharField(max_length=255, unique=True)
- class Book(models.Model):
- title = models.CharField(max_length=256)
- chapters = models.ManyToManyField(Chapter)
- You can use ``get_or_create()`` through Book's chapters field, but it only
- fetches inside the context of that book:
- .. code-block:: pycon
- >>> book = Book.objects.create(title="Ulysses")
- >>> book.chapters.get_or_create(title="Telemachus")
- (<Chapter: Telemachus>, True)
- >>> book.chapters.get_or_create(title="Telemachus")
- (<Chapter: Telemachus>, False)
- >>> Chapter.objects.create(title="Chapter 1")
- <Chapter: Chapter 1>
- >>> book.chapters.get_or_create(title="Chapter 1")
- # Raises IntegrityError
- This is happening because it's trying to get or create "Chapter 1" through the
- book "Ulysses", but it can't do any of them: the relation can't fetch that
- chapter because it isn't related to that book, but it can't create it either
- because ``title`` field should be unique.
- ``update_or_create()``
- ~~~~~~~~~~~~~~~~~~~~~~
- .. method:: update_or_create(defaults=None, create_defaults=None, **kwargs)
- .. method:: aupdate_or_create(defaults=None, create_defaults=None, **kwargs)
- *Asynchronous version*: ``aupdate_or_create()``
- A convenience method for updating an object with the given ``kwargs``, creating
- a new one if necessary. Both ``create_defaults`` and ``defaults`` are
- dictionaries of (field, value) pairs. The values in both ``create_defaults``
- and ``defaults`` can be callables. ``defaults`` is used to update the object
- while ``create_defaults`` are used for the create operation. If
- ``create_defaults`` is not supplied, ``defaults`` will be used for the create
- operation.
- Returns a tuple of ``(object, created)``, where ``object`` is the created or
- updated object and ``created`` is a boolean specifying whether a new object was
- created.
- The ``update_or_create`` method tries to fetch an object from database based on
- the given ``kwargs``. If a match is found, it updates the fields passed in the
- ``defaults`` dictionary.
- This is meant as a shortcut to boilerplatish code. For example::
- defaults = {"first_name": "Bob"}
- create_defaults = {"first_name": "Bob", "birthday": date(1940, 10, 9)}
- try:
- obj = Person.objects.get(first_name="John", last_name="Lennon")
- for key, value in defaults.items():
- setattr(obj, key, value)
- obj.save()
- except Person.DoesNotExist:
- new_values = {"first_name": "John", "last_name": "Lennon"}
- new_values.update(create_defaults)
- obj = Person(**new_values)
- obj.save()
- This pattern gets quite unwieldy as the number of fields in a model goes up.
- The above example can be rewritten using ``update_or_create()`` like so::
- obj, created = Person.objects.update_or_create(
- first_name="John",
- last_name="Lennon",
- defaults={"first_name": "Bob"},
- create_defaults={"first_name": "Bob", "birthday": date(1940, 10, 9)},
- )
- For a detailed description of how names passed in ``kwargs`` are resolved, see
- :meth:`get_or_create`.
- As described above in :meth:`get_or_create`, this method is prone to a
- race-condition which can result in multiple rows being inserted simultaneously
- if uniqueness is not enforced at the database level.
- Like :meth:`get_or_create` and :meth:`create`, if you're using manually
- specified primary keys and an object needs to be created but the key already
- exists in the database, an :exc:`~django.db.IntegrityError` is raised.
- ``bulk_create()``
- ~~~~~~~~~~~~~~~~~
- .. method:: bulk_create(objs, batch_size=None, ignore_conflicts=False, update_conflicts=False, update_fields=None, unique_fields=None)
- .. method:: abulk_create(objs, batch_size=None, ignore_conflicts=False, update_conflicts=False, update_fields=None, unique_fields=None)
- *Asynchronous version*: ``abulk_create()``
- This method inserts the provided list of objects into the database in an
- efficient manner (generally only 1 query, no matter how many objects there
- are), and returns created objects as a list, in the same order as provided:
- .. code-block:: pycon
- >>> objs = Entry.objects.bulk_create(
- ... [
- ... Entry(headline="This is a test"),
- ... Entry(headline="This is only a test"),
- ... ]
- ... )
- This has a number of caveats though:
- * The model's ``save()`` method will not be called, and the ``pre_save`` and
- ``post_save`` signals will not be sent.
- * It does not work with child models in a multi-table inheritance scenario.
- * If the model's primary key is an :class:`~django.db.models.AutoField` and
- ``ignore_conflicts`` is False, the primary key attribute can only be
- retrieved on certain databases (currently PostgreSQL, MariaDB, and SQLite
- 3.35+). On other databases, it will not be set.
- * It does not work with many-to-many relationships.
- * It casts ``objs`` to a list, which fully evaluates ``objs`` if it's a
- generator. The cast allows inspecting all objects so that any objects with a
- manually set primary key can be inserted first. If you want to insert objects
- in batches without evaluating the entire generator at once, you can use this
- technique as long as the objects don't have any manually set primary keys::
- from itertools import islice
- batch_size = 100
- objs = (Entry(headline="Test %s" % i) for i in range(1000))
- while True:
- batch = list(islice(objs, batch_size))
- if not batch:
- break
- Entry.objects.bulk_create(batch, batch_size)
- The ``batch_size`` parameter controls how many objects are created in a single
- query. The default is to create all objects in one batch, except for SQLite
- where the default is such that at most 999 variables per query are used.
- On databases that support it (all but Oracle), setting the ``ignore_conflicts``
- parameter to ``True`` tells the database to ignore failure to insert any rows
- that fail constraints such as duplicate unique values.
- On databases that support it (all except Oracle), setting the
- ``update_conflicts`` parameter to ``True``, tells the database to update
- ``update_fields`` when a row insertion fails on conflicts. On PostgreSQL and
- SQLite, in addition to ``update_fields``, a list of ``unique_fields`` that may
- be in conflict must be provided.
- Enabling the ``ignore_conflicts`` parameter disables setting the primary key on
- each model instance (if the database normally supports it).
- .. warning::
- On MySQL and MariaDB, setting the ``ignore_conflicts`` parameter to
- ``True`` turns certain types of errors, other than duplicate key, into
- warnings. Even with Strict Mode. For example: invalid values or
- non-nullable violations. See the `MySQL documentation`_ and
- `MariaDB documentation`_ for more details.
- .. _MySQL documentation: https://dev.mysql.com/doc/refman/en/sql-mode.html#ignore-strict-comparison
- .. _MariaDB documentation: https://mariadb.com/kb/en/ignore/
- ``bulk_update()``
- ~~~~~~~~~~~~~~~~~
- .. method:: bulk_update(objs, fields, batch_size=None)
- .. method:: abulk_update(objs, fields, batch_size=None)
- *Asynchronous version*: ``abulk_update()``
- This method efficiently updates the given fields on the provided model
- instances, generally with one query, and returns the number of objects
- updated:
- .. code-block:: pycon
- >>> objs = [
- ... Entry.objects.create(headline="Entry 1"),
- ... Entry.objects.create(headline="Entry 2"),
- ... ]
- >>> objs[0].headline = "This is entry 1"
- >>> objs[1].headline = "This is entry 2"
- >>> Entry.objects.bulk_update(objs, ["headline"])
- 2
- :meth:`.QuerySet.update` is used to save the changes, so this is more efficient
- than iterating through the list of models and calling ``save()`` on each of
- them, but it has a few caveats:
- * You cannot update the model's primary key.
- * Each model's ``save()`` method isn't called, and the
- :attr:`~django.db.models.signals.pre_save` and
- :attr:`~django.db.models.signals.post_save` signals aren't sent.
- * If updating a large number of columns in a large number of rows, the SQL
- generated can be very large. Avoid this by specifying a suitable
- ``batch_size``.
- * Updating fields defined on multi-table inheritance ancestors will incur an
- extra query per ancestor.
- * When an individual batch contains duplicates, only the first instance in that
- batch will result in an update.
- * The number of objects updated returned by the function may be fewer than the
- number of objects passed in. This can be due to duplicate objects passed in
- which are updated in the same batch or race conditions such that objects are
- no longer present in the database.
- The ``batch_size`` parameter controls how many objects are saved in a single
- query. The default is to update all objects in one batch, except for SQLite
- and Oracle which have restrictions on the number of variables used in a query.
- ``count()``
- ~~~~~~~~~~~
- .. method:: count()
- .. method:: acount()
- *Asynchronous version*: ``acount()``
- Returns an integer representing the number of objects in the database matching
- the ``QuerySet``.
- Example::
- # Returns the total number of entries in the database.
- Entry.objects.count()
- # Returns the number of entries whose headline contains 'Lennon'
- Entry.objects.filter(headline__contains="Lennon").count()
- A ``count()`` call performs a ``SELECT COUNT(*)`` behind the scenes, so you
- should always use ``count()`` rather than loading all of the record into Python
- objects and calling ``len()`` on the result (unless you need to load the
- objects into memory anyway, in which case ``len()`` will be faster).
- Note that if you want the number of items in a ``QuerySet`` and are also
- retrieving model instances from it (for example, by iterating over it), it's
- probably more efficient to use ``len(queryset)`` which won't cause an extra
- database query like ``count()`` would.
- If the queryset has already been fully retrieved, ``count()`` will use that
- length rather than perform an extra database query.
- ``in_bulk()``
- ~~~~~~~~~~~~~
- .. method:: in_bulk(id_list=None, *, field_name='pk')
- .. method:: ain_bulk(id_list=None, *, field_name='pk')
- *Asynchronous version*: ``ain_bulk()``
- Takes a list of field values (``id_list``) and the ``field_name`` for those
- values, and returns a dictionary mapping each value to an instance of the
- object with the given field value. No
- :exc:`django.core.exceptions.ObjectDoesNotExist` exceptions will ever be raised
- by ``in_bulk``; that is, any ``id_list`` value not matching any instance will
- simply be ignored. If ``id_list`` isn't provided, all objects
- in the queryset are returned. ``field_name`` must be a unique field or a
- distinct field (if there's only one field specified in :meth:`distinct`).
- ``field_name`` defaults to the primary key.
- Example:
- .. code-block:: pycon
- >>> Blog.objects.in_bulk([1])
- {1: <Blog: Beatles Blog>}
- >>> Blog.objects.in_bulk([1, 2])
- {1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>}
- >>> Blog.objects.in_bulk([])
- {}
- >>> Blog.objects.in_bulk()
- {1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>, 3: <Blog: Django Weblog>}
- >>> Blog.objects.in_bulk(["beatles_blog"], field_name="slug")
- {'beatles_blog': <Blog: Beatles Blog>}
- >>> Blog.objects.distinct("name").in_bulk(field_name="name")
- {'Beatles Blog': <Blog: Beatles Blog>, 'Cheddar Talk': <Blog: Cheddar Talk>, 'Django Weblog': <Blog: Django Weblog>}
- If you pass ``in_bulk()`` an empty list, you'll get an empty dictionary.
- ``iterator()``
- ~~~~~~~~~~~~~~
- .. method:: iterator(chunk_size=None)
- .. method:: aiterator(chunk_size=None)
- *Asynchronous version*: ``aiterator()``
- Evaluates the ``QuerySet`` (by performing the query) and returns an iterator
- (see :pep:`234`) over the results, or an asynchronous iterator (see :pep:`492`)
- if you call its asynchronous version ``aiterator``.
- A ``QuerySet`` typically caches its results internally so that repeated
- evaluations do not result in additional queries. In contrast, ``iterator()``
- will read results directly, without doing any caching at the ``QuerySet`` level
- (internally, the default iterator calls ``iterator()`` and caches the return
- value). For a ``QuerySet`` which returns a large number of objects that you
- only need to access once, this can result in better performance and a
- significant reduction in memory.
- Note that using ``iterator()`` on a ``QuerySet`` which has already been
- evaluated will force it to evaluate again, repeating the query.
- ``iterator()`` is compatible with previous calls to ``prefetch_related()`` as
- long as ``chunk_size`` is given. Larger values will necessitate fewer queries
- to accomplish the prefetching at the cost of greater memory usage.
- On some databases (e.g. Oracle, `SQLite
- <https://www.sqlite.org/limits.html#max_variable_number>`_), the maximum number
- of terms in an SQL ``IN`` clause might be limited. Hence values below this
- limit should be used. (In particular, when prefetching across two or more
- relations, a ``chunk_size`` should be small enough that the anticipated number
- of results for each prefetched relation still falls below the limit.)
- So long as the QuerySet does not prefetch any related objects, providing no
- value for ``chunk_size`` will result in Django using an implicit default of
- 2000.
- Depending on the database backend, query results will either be loaded all at
- once or streamed from the database using server-side cursors.
- With server-side cursors
- ^^^^^^^^^^^^^^^^^^^^^^^^
- Oracle and :ref:`PostgreSQL <postgresql-server-side-cursors>` use server-side
- cursors to stream results from the database without loading the entire result
- set into memory.
- The Oracle database driver always uses server-side cursors.
- With server-side cursors, the ``chunk_size`` parameter specifies the number of
- results to cache at the database driver level. Fetching bigger chunks
- diminishes the number of round trips between the database driver and the
- database, at the expense of memory.
- On PostgreSQL, server-side cursors will only be used when the
- :setting:`DISABLE_SERVER_SIDE_CURSORS <DATABASE-DISABLE_SERVER_SIDE_CURSORS>`
- setting is ``False``. Read :ref:`transaction-pooling-server-side-cursors` if
- you're using a connection pooler configured in transaction pooling mode. When
- server-side cursors are disabled, the behavior is the same as databases that
- don't support server-side cursors.
- Without server-side cursors
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
- MySQL doesn't support streaming results, hence the Python database driver loads
- the entire result set into memory. The result set is then transformed into
- Python row objects by the database adapter using the ``fetchmany()`` method
- defined in :pep:`249`.
- SQLite can fetch results in batches using ``fetchmany()``, but since SQLite
- doesn't provide isolation between queries within a connection, be careful when
- writing to the table being iterated over. See :ref:`sqlite-isolation` for
- more information.
- The ``chunk_size`` parameter controls the size of batches Django retrieves from
- the database driver. Larger batches decrease the overhead of communicating with
- the database driver at the expense of a slight increase in memory consumption.
- So long as the QuerySet does not prefetch any related objects, providing no
- value for ``chunk_size`` will result in Django using an implicit default of
- 2000, a value derived from `a calculation on the psycopg mailing list
- <https://www.postgresql.org/message-id/4D2F2C71.8080805%40dndg.it>`_:
- Assuming rows of 10-20 columns with a mix of textual and numeric data, 2000
- is going to fetch less than 100KB of data, which seems a good compromise
- between the number of rows transferred and the data discarded if the loop
- is exited early.
- ``latest()``
- ~~~~~~~~~~~~
- .. method:: latest(*fields)
- .. method:: alatest(*fields)
- *Asynchronous version*: ``alatest()``
- Returns the latest object in the table based on the given field(s).
- This example returns the latest ``Entry`` in the table, according to the
- ``pub_date`` field::
- Entry.objects.latest("pub_date")
- You can also choose the latest based on several fields. For example, to select
- the ``Entry`` with the earliest ``expire_date`` when two entries have the same
- ``pub_date``::
- Entry.objects.latest("pub_date", "-expire_date")
- The negative sign in ``'-expire_date'`` means to sort ``expire_date`` in
- *descending* order. Since ``latest()`` gets the last result, the ``Entry`` with
- the earliest ``expire_date`` is selected.
- If your model's :ref:`Meta <meta-options>` specifies
- :attr:`~django.db.models.Options.get_latest_by`, you can omit any arguments to
- ``earliest()`` or ``latest()``. The fields specified in
- :attr:`~django.db.models.Options.get_latest_by` will be used by default.
- Like :meth:`get()`, ``earliest()`` and ``latest()`` raise
- :exc:`~django.db.models.Model.DoesNotExist` if there is no object with the
- given parameters.
- Note that ``earliest()`` and ``latest()`` exist purely for convenience and
- readability.
- .. admonition:: ``earliest()`` and ``latest()`` may return instances with null dates.
- Since ordering is delegated to the database, results on fields that allow
- null values may be ordered differently if you use different databases. For
- example, PostgreSQL and MySQL sort null values as if they are higher than
- non-null values, while SQLite does the opposite.
- You may want to filter out null values::
- Entry.objects.filter(pub_date__isnull=False).latest("pub_date")
- ``earliest()``
- ~~~~~~~~~~~~~~
- .. method:: earliest(*fields)
- .. method:: aearliest(*fields)
- *Asynchronous version*: ``aearliest()``
- Works otherwise like :meth:`~django.db.models.query.QuerySet.latest` except
- the direction is changed.
- ``first()``
- ~~~~~~~~~~~
- .. method:: first()
- .. method:: afirst()
- *Asynchronous version*: ``afirst()``
- Returns the first object matched by the queryset, or ``None`` if there
- is no matching object. If the ``QuerySet`` has no ordering defined, then the
- queryset is automatically ordered by the primary key. This can affect
- aggregation results as described in :ref:`aggregation-ordering-interaction`.
- Example::
- p = Article.objects.order_by("title", "pub_date").first()
- Note that ``first()`` is a convenience method, the following code sample is
- equivalent to the above example::
- try:
- p = Article.objects.order_by("title", "pub_date")[0]
- except IndexError:
- p = None
- ``last()``
- ~~~~~~~~~~
- .. method:: last()
- .. method:: alast()
- *Asynchronous version*: ``alast()``
- Works like :meth:`first()`, but returns the last object in the queryset.
- ``aggregate()``
- ~~~~~~~~~~~~~~~
- .. method:: aggregate(*args, **kwargs)
- .. method:: aaggregate(*args, **kwargs)
- *Asynchronous version*: ``aaggregate()``
- Returns a dictionary of aggregate values (averages, sums, etc.) calculated over
- the ``QuerySet``. Each argument to ``aggregate()`` specifies a value that will
- be included in the dictionary that is returned.
- The aggregation functions that are provided by Django are described in
- `Aggregation Functions`_ below. Since aggregates are also :doc:`query
- expressions </ref/models/expressions>`, you may combine aggregates with other
- aggregates or values to create complex aggregates.
- Aggregates specified using keyword arguments will use the keyword as the name
- for the annotation. Anonymous arguments will have a name generated for them
- based upon the name of the aggregate function and the model field that is being
- aggregated. Complex aggregates cannot use anonymous arguments and must specify
- a keyword argument as an alias.
- For example, when you are working with blog entries, you may want to know the
- number of authors that have contributed blog entries:
- .. code-block:: pycon
- >>> from django.db.models import Count
- >>> Blog.objects.aggregate(Count("entry"))
- {'entry__count': 16}
- By using a keyword argument to specify the aggregate function, you can
- control the name of the aggregation value that is returned:
- .. code-block:: pycon
- >>> Blog.objects.aggregate(number_of_entries=Count("entry"))
- {'number_of_entries': 16}
- For an in-depth discussion of aggregation, see :doc:`the topic guide on
- Aggregation </topics/db/aggregation>`.
- ``exists()``
- ~~~~~~~~~~~~
- .. method:: exists()
- .. method:: aexists()
- *Asynchronous version*: ``aexists()``
- Returns ``True`` if the :class:`.QuerySet` contains any results, and ``False``
- if not. This tries to perform the query in the simplest and fastest way
- possible, but it *does* execute nearly the same query as a normal
- :class:`.QuerySet` query.
- :meth:`~.QuerySet.exists` is useful for searches relating to the existence of
- any objects in a :class:`.QuerySet`, particularly in the context of a large
- :class:`.QuerySet`.
- To find whether a queryset contains any items::
- if some_queryset.exists():
- print("There is at least one object in some_queryset")
- Which will be faster than::
- if some_queryset:
- print("There is at least one object in some_queryset")
- ... but not by a large degree (hence needing a large queryset for efficiency
- gains).
- Additionally, if a ``some_queryset`` has not yet been evaluated, but you know
- that it will be at some point, then using ``some_queryset.exists()`` will do
- more overall work (one query for the existence check plus an extra one to later
- retrieve the results) than using ``bool(some_queryset)``, which retrieves the
- results and then checks if any were returned.
- ``contains()``
- ~~~~~~~~~~~~~~
- .. method:: contains(obj)
- .. method:: acontains(obj)
- *Asynchronous version*: ``acontains()``
- Returns ``True`` if the :class:`.QuerySet` contains ``obj``, and ``False`` if
- not. This tries to perform the query in the simplest and fastest way possible.
- :meth:`contains` is useful for checking an object membership in a
- :class:`.QuerySet`, particularly in the context of a large :class:`.QuerySet`.
- To check whether a queryset contains a specific item::
- if some_queryset.contains(obj):
- print("Entry contained in queryset")
- This will be faster than the following which requires evaluating and iterating
- through the entire queryset::
- if obj in some_queryset:
- print("Entry contained in queryset")
- Like :meth:`exists`, if ``some_queryset`` has not yet been evaluated, but you
- know that it will be at some point, then using ``some_queryset.contains(obj)``
- will make an additional database query, generally resulting in slower overall
- performance.
- ``update()``
- ~~~~~~~~~~~~
- .. method:: update(**kwargs)
- .. method:: aupdate(**kwargs)
- *Asynchronous version*: ``aupdate()``
- Performs an SQL update query for the specified fields, and returns
- the number of rows matched (which may not be equal to the number of rows
- updated if some rows already have the new value).
- For example, to turn comments off for all blog entries published in 2010,
- you could do this:
- .. code-block:: pycon
- >>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False)
- (This assumes your ``Entry`` model has fields ``pub_date`` and ``comments_on``.)
- You can update multiple fields — there's no limit on how many. For example,
- here we update the ``comments_on`` and ``headline`` fields:
- .. code-block:: pycon
- >>> Entry.objects.filter(pub_date__year=2010).update(
- ... comments_on=False, headline="This is old"
- ... )
- The ``update()`` method is applied instantly, and the only restriction on the
- :class:`.QuerySet` that is updated is that it can only update columns in the
- model's main table, not on related models. You can't do this, for example:
- .. code-block:: pycon
- >>> Entry.objects.update(blog__name="foo") # Won't work!
- Filtering based on related fields is still possible, though:
- .. code-block:: pycon
- >>> Entry.objects.filter(blog__id=1).update(comments_on=True)
- You cannot call ``update()`` on a :class:`.QuerySet` that has had a slice taken
- or can otherwise no longer be filtered.
- The ``update()`` method returns the number of affected rows:
- .. code-block:: pycon
- >>> Entry.objects.filter(id=64).update(comments_on=True)
- 1
- >>> Entry.objects.filter(slug="nonexistent-slug").update(comments_on=True)
- 0
- >>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False)
- 132
- If you're just updating a record and don't need to do anything with the model
- object, the most efficient approach is to call ``update()``, rather than
- loading the model object into memory. For example, instead of doing this::
- e = Entry.objects.get(id=10)
- e.comments_on = False
- e.save()
- ...do this::
- Entry.objects.filter(id=10).update(comments_on=False)
- Using ``update()`` also prevents a race condition wherein something might
- change in your database in the short period of time between loading the object
- and calling ``save()``.
- Finally, realize that ``update()`` does an update at the SQL level and, thus,
- does not call any ``save()`` methods on your models, nor does it emit the
- :attr:`~django.db.models.signals.pre_save` or
- :attr:`~django.db.models.signals.post_save` signals (which are a consequence of
- calling :meth:`Model.save() <django.db.models.Model.save>`). If you want to
- update a bunch of records for a model that has a custom
- :meth:`~django.db.models.Model.save()` method, loop over them and call
- :meth:`~django.db.models.Model.save()`, like this::
- for e in Entry.objects.filter(pub_date__year=2010):
- e.comments_on = False
- e.save()
- Ordered queryset
- ^^^^^^^^^^^^^^^^
- Chaining ``order_by()`` with ``update()`` is supported only on MariaDB and
- MySQL, and is ignored for different databases. This is useful for updating a
- unique field in the order that is specified without conflicts. For example::
- Entry.objects.order_by("-number").update(number=F("number") + 1)
- .. note::
- ``order_by()`` clause will be ignored if it contains annotations, inherited
- fields, or lookups spanning relations.
- ``delete()``
- ~~~~~~~~~~~~
- .. method:: delete()
- .. method:: adelete()
- *Asynchronous version*: ``adelete()``
- Performs an SQL delete query on all rows in the :class:`.QuerySet` and
- returns the number of objects deleted and a dictionary with the number of
- deletions per object type.
- The ``delete()`` is applied instantly. You cannot call ``delete()`` on a
- :class:`.QuerySet` that has had a slice taken or can otherwise no longer be
- filtered.
- For example, to delete all the entries in a particular blog:
- .. code-block:: pycon
- >>> b = Blog.objects.get(pk=1)
- # Delete all the entries belonging to this Blog.
- >>> Entry.objects.filter(blog=b).delete()
- (4, {'blog.Entry': 2, 'blog.Entry_authors': 2})
- By default, Django's :class:`~django.db.models.ForeignKey` emulates the SQL
- constraint ``ON DELETE CASCADE`` — in other words, any objects with foreign
- keys pointing at the objects to be deleted will be deleted along with them.
- For example:
- .. code-block:: pycon
- >>> blogs = Blog.objects.all()
- # This will delete all Blogs and all of their Entry objects.
- >>> blogs.delete()
- (5, {'blog.Blog': 1, 'blog.Entry': 2, 'blog.Entry_authors': 2})
- This cascade behavior is customizable via the
- :attr:`~django.db.models.ForeignKey.on_delete` argument to the
- :class:`~django.db.models.ForeignKey`.
- The ``delete()`` method does a bulk delete and does not call any ``delete()``
- methods on your models. It does, however, emit the
- :data:`~django.db.models.signals.pre_delete` and
- :data:`~django.db.models.signals.post_delete` signals for all deleted objects
- (including cascaded deletions).
- Django needs to fetch objects into memory to send signals and handle cascades.
- However, if there are no cascades and no signals, then Django may take a
- fast-path and delete objects without fetching into memory. For large
- deletes this can result in significantly reduced memory usage. The amount of
- executed queries can be reduced, too.
- ForeignKeys which are set to :attr:`~django.db.models.ForeignKey.on_delete`
- ``DO_NOTHING`` do not prevent taking the fast-path in deletion.
- Note that the queries generated in object deletion is an implementation
- detail subject to change.
- ``as_manager()``
- ~~~~~~~~~~~~~~~~
- .. classmethod:: as_manager()
- Class method that returns an instance of :class:`~django.db.models.Manager`
- with a copy of the ``QuerySet``’s methods. See
- :ref:`create-manager-with-queryset-methods` for more details.
- Note that unlike the other entries in this section, this does not have an
- asynchronous variant as it does not execute a query.
- ``explain()``
- ~~~~~~~~~~~~~
- .. method:: explain(format=None, **options)
- .. method:: aexplain(format=None, **options)
- *Asynchronous version*: ``aexplain()``
- Returns a string of the ``QuerySet``’s execution plan, which details how the
- database would execute the query, including any indexes or joins that would be
- used. Knowing these details may help you improve the performance of slow
- queries.
- For example, when using PostgreSQL:
- .. code-block:: pycon
- >>> print(Blog.objects.filter(title="My Blog").explain())
- Seq Scan on blog (cost=0.00..35.50 rows=10 width=12)
- Filter: (title = 'My Blog'::bpchar)
- The output differs significantly between databases.
- ``explain()`` is supported by all built-in database backends except Oracle
- because an implementation there isn't straightforward.
- The ``format`` parameter changes the output format from the databases's
- default, which is usually text-based. PostgreSQL supports ``'TEXT'``,
- ``'JSON'``, ``'YAML'``, and ``'XML'`` formats. MariaDB and MySQL support
- ``'TEXT'`` (also called ``'TRADITIONAL'``) and ``'JSON'`` formats. MySQL
- 8.0.16+ also supports an improved ``'TREE'`` format, which is similar to
- PostgreSQL's ``'TEXT'`` output and is used by default, if supported.
- Some databases accept flags that can return more information about the query.
- Pass these flags as keyword arguments. For example, when using PostgreSQL:
- .. code-block:: pycon
- >>> print(Blog.objects.filter(title="My Blog").explain(verbose=True, analyze=True))
- Seq Scan on public.blog (cost=0.00..35.50 rows=10 width=12) (actual time=0.004..0.004 rows=10 loops=1)
- Output: id, title
- Filter: (blog.title = 'My Blog'::bpchar)
- Planning time: 0.064 ms
- Execution time: 0.058 ms
- On some databases, flags may cause the query to be executed which could have
- adverse effects on your database. For example, the ``ANALYZE`` flag supported
- by MariaDB, MySQL 8.0.18+, and PostgreSQL could result in changes to data if
- there are triggers or if a function is called, even for a ``SELECT`` query.
- .. versionchanged:: 5.1
- Support for the ``generic_plan`` option on PostgreSQL 16+ was added.
- .. versionchanged:: 5.2
- Support for the ``memory`` and ``serialize`` options on PostgreSQL 17+ was
- added.
- .. _field-lookups:
- ``Field`` lookups
- -----------------
- Field lookups are how you specify the meat of an SQL ``WHERE`` clause. They're
- specified as keyword arguments to the ``QuerySet`` methods :meth:`filter()`,
- :meth:`exclude()` and :meth:`get()`.
- For an introduction, see :ref:`models and database queries documentation
- <field-lookups-intro>`.
- Django's built-in lookups are listed below. It is also possible to write
- :doc:`custom lookups </howto/custom-lookups>` for model fields.
- As a convenience when no lookup type is provided (like in
- ``Entry.objects.get(id=14)``) the lookup type is assumed to be :lookup:`exact`.
- .. fieldlookup:: exact
- ``exact``
- ~~~~~~~~~
- Exact match. If the value provided for comparison is ``None``, it will be
- interpreted as an SQL ``NULL`` (see :lookup:`isnull` for more details).
- Examples::
- Entry.objects.get(id__exact=14)
- Entry.objects.get(id__exact=None)
- SQL equivalents:
- .. code-block:: sql
- SELECT ... WHERE id = 14;
- SELECT ... WHERE id IS NULL;
- .. admonition:: MySQL comparisons
- In MySQL, a database table's "collation" setting determines whether
- ``exact`` comparisons are case-sensitive. This is a database setting, *not*
- a Django setting. It's possible to configure your MySQL tables to use
- case-sensitive comparisons, but some trade-offs are involved. For more
- information about this, see the :ref:`collation section <mysql-collation>`
- in the :doc:`databases </ref/databases>` documentation.
- .. fieldlookup:: iexact
- ``iexact``
- ~~~~~~~~~~
- Case-insensitive exact match. If the value provided for comparison is ``None``,
- it will be interpreted as an SQL ``NULL`` (see :lookup:`isnull` for more
- details).
- Example::
- Blog.objects.get(name__iexact="beatles blog")
- Blog.objects.get(name__iexact=None)
- SQL equivalents:
- .. code-block:: sql
- SELECT ... WHERE name ILIKE 'beatles blog';
- SELECT ... WHERE name IS NULL;
- Note the first query will match ``'Beatles Blog'``, ``'beatles blog'``,
- ``'BeAtLes BLoG'``, etc.
- .. admonition:: SQLite users
- When using the SQLite backend and non-ASCII strings, bear in mind the
- :ref:`database note <sqlite-string-matching>` about string comparisons.
- SQLite does not do case-insensitive matching for non-ASCII strings.
- .. fieldlookup:: contains
- ``contains``
- ~~~~~~~~~~~~
- Case-sensitive containment test.
- Example::
- Entry.objects.get(headline__contains="Lennon")
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE headline LIKE '%Lennon%';
- Note this will match the headline ``'Lennon honored today'`` but not ``'lennon
- honored today'``.
- .. admonition:: SQLite users
- SQLite doesn't support case-sensitive ``LIKE`` statements; ``contains``
- acts like ``icontains`` for SQLite. See the :ref:`database note
- <sqlite-string-matching>` for more information.
- .. fieldlookup:: icontains
- ``icontains``
- ~~~~~~~~~~~~~
- Case-insensitive containment test.
- Example::
- Entry.objects.get(headline__icontains="Lennon")
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE headline ILIKE '%Lennon%';
- .. admonition:: SQLite users
- When using the SQLite backend and non-ASCII strings, bear in mind the
- :ref:`database note <sqlite-string-matching>` about string comparisons.
- .. fieldlookup:: in
- ``in``
- ~~~~~~
- In a given iterable; often a list, tuple, or queryset. It's not a common use
- case, but strings (being iterables) are accepted.
- Examples::
- Entry.objects.filter(id__in=[1, 3, 4])
- Entry.objects.filter(headline__in="abc")
- SQL equivalents:
- .. code-block:: sql
- SELECT ... WHERE id IN (1, 3, 4);
- SELECT ... WHERE headline IN ('a', 'b', 'c');
- You can also use a queryset to dynamically evaluate the list of values
- instead of providing a list of literal values::
- inner_qs = Blog.objects.filter(name__contains="Cheddar")
- entries = Entry.objects.filter(blog__in=inner_qs)
- This queryset will be evaluated as subselect statement:
- .. code-block:: sql
- SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
- If you pass in a ``QuerySet`` resulting from ``values()`` or ``values_list()``
- as the value to an ``__in`` lookup, you need to ensure you are only extracting
- one field in the result. For example, this will work (filtering on the blog
- names)::
- inner_qs = Blog.objects.filter(name__contains="Ch").values("name")
- entries = Entry.objects.filter(blog__name__in=inner_qs)
- This example will raise an exception, since the inner query is trying to
- extract two field values, where only one is expected::
- # Bad code! Will raise a TypeError.
- inner_qs = Blog.objects.filter(name__contains="Ch").values("name", "id")
- entries = Entry.objects.filter(blog__name__in=inner_qs)
- .. _nested-queries-performance:
- .. admonition:: Performance considerations
- Be cautious about using nested queries and understand your database
- server's performance characteristics (if in doubt, benchmark!). Some
- database backends, most notably MySQL, don't optimize nested queries very
- well. It is more efficient, in those cases, to extract a list of values
- and then pass that into the second query. That is, execute two queries
- instead of one::
- values = Blog.objects.filter(name__contains="Cheddar").values_list("pk", flat=True)
- entries = Entry.objects.filter(blog__in=list(values))
- Note the ``list()`` call around the Blog ``QuerySet`` to force execution of
- the first query. Without it, a nested query would be executed, because
- :ref:`querysets-are-lazy`.
- .. fieldlookup:: gt
- ``gt``
- ~~~~~~
- Greater than.
- Example::
- Entry.objects.filter(id__gt=4)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE id > 4;
- .. fieldlookup:: gte
- ``gte``
- ~~~~~~~
- Greater than or equal to.
- .. fieldlookup:: lt
- ``lt``
- ~~~~~~
- Less than.
- .. fieldlookup:: lte
- ``lte``
- ~~~~~~~
- Less than or equal to.
- .. fieldlookup:: startswith
- ``startswith``
- ~~~~~~~~~~~~~~
- Case-sensitive starts-with.
- Example::
- Entry.objects.filter(headline__startswith="Lennon")
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE headline LIKE 'Lennon%';
- SQLite doesn't support case-sensitive ``LIKE`` statements; ``startswith`` acts
- like ``istartswith`` for SQLite.
- .. fieldlookup:: istartswith
- ``istartswith``
- ~~~~~~~~~~~~~~~
- Case-insensitive starts-with.
- Example::
- Entry.objects.filter(headline__istartswith="Lennon")
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE headline ILIKE 'Lennon%';
- .. admonition:: SQLite users
- When using the SQLite backend and non-ASCII strings, bear in mind the
- :ref:`database note <sqlite-string-matching>` about string comparisons.
- .. fieldlookup:: endswith
- ``endswith``
- ~~~~~~~~~~~~
- Case-sensitive ends-with.
- Example::
- Entry.objects.filter(headline__endswith="Lennon")
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE headline LIKE '%Lennon';
- .. admonition:: SQLite users
- SQLite doesn't support case-sensitive ``LIKE`` statements; ``endswith``
- acts like ``iendswith`` for SQLite. Refer to the :ref:`database note
- <sqlite-string-matching>` documentation for more.
- .. fieldlookup:: iendswith
- ``iendswith``
- ~~~~~~~~~~~~~
- Case-insensitive ends-with.
- Example::
- Entry.objects.filter(headline__iendswith="Lennon")
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE headline ILIKE '%Lennon'
- .. admonition:: SQLite users
- When using the SQLite backend and non-ASCII strings, bear in mind the
- :ref:`database note <sqlite-string-matching>` about string comparisons.
- .. fieldlookup:: range
- ``range``
- ~~~~~~~~~
- Range test (inclusive).
- Example::
- import datetime
- start_date = datetime.date(2005, 1, 1)
- end_date = datetime.date(2005, 3, 31)
- Entry.objects.filter(pub_date__range=(start_date, end_date))
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
- You can use ``range`` anywhere you can use ``BETWEEN`` in SQL — for dates,
- numbers and even characters.
- .. warning::
- Filtering a ``DateTimeField`` with dates won't include items on the last
- day, because the bounds are interpreted as "0am on the given date". If
- ``pub_date`` was a ``DateTimeField``, the above expression would be turned
- into this SQL:
- .. code-block:: sql
- SELECT ... WHERE pub_date BETWEEN '2005-01-01 00:00:00' and '2005-03-31 00:00:00';
- Generally speaking, you can't mix dates and datetimes.
- .. fieldlookup:: date
- ``date``
- ~~~~~~~~
- For datetime fields, casts the value as date. Allows chaining additional field
- lookups. Takes a date value.
- Example::
- Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
- Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
- (No equivalent SQL code fragment is included for this lookup because
- implementation of the relevant query varies among different database engines.)
- When :setting:`USE_TZ` is ``True``, fields are converted to the current time
- zone before filtering. This requires :ref:`time zone definitions in the
- database <database-time-zone-definitions>`.
- .. fieldlookup:: year
- ``year``
- ~~~~~~~~
- For date and datetime fields, an exact year match. Allows chaining additional
- field lookups. Takes an integer year.
- Example::
- Entry.objects.filter(pub_date__year=2005)
- Entry.objects.filter(pub_date__year__gte=2005)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31';
- SELECT ... WHERE pub_date >= '2005-01-01';
- (The exact SQL syntax varies for each database engine.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: iso_year
- ``iso_year``
- ~~~~~~~~~~~~
- For date and datetime fields, an exact ISO 8601 week-numbering year match.
- Allows chaining additional field lookups. Takes an integer year.
- Example::
- Entry.objects.filter(pub_date__iso_year=2005)
- Entry.objects.filter(pub_date__iso_year__gte=2005)
- (The exact SQL syntax varies for each database engine.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: month
- ``month``
- ~~~~~~~~~
- For date and datetime fields, an exact month match. Allows chaining additional
- field lookups. Takes an integer 1 (January) through 12 (December).
- Example::
- Entry.objects.filter(pub_date__month=12)
- Entry.objects.filter(pub_date__month__gte=6)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12';
- SELECT ... WHERE EXTRACT('month' FROM pub_date) >= '6';
- (The exact SQL syntax varies for each database engine.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: day
- ``day``
- ~~~~~~~
- For date and datetime fields, an exact day match. Allows chaining additional
- field lookups. Takes an integer day.
- Example::
- Entry.objects.filter(pub_date__day=3)
- Entry.objects.filter(pub_date__day__gte=3)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE EXTRACT('day' FROM pub_date) = '3';
- SELECT ... WHERE EXTRACT('day' FROM pub_date) >= '3';
- (The exact SQL syntax varies for each database engine.)
- Note this will match any record with a pub_date on the third day of the month,
- such as January 3, July 3, etc.
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: week
- ``week``
- ~~~~~~~~
- For date and datetime fields, return the week number (1-52 or 53) according
- to `ISO-8601 <https://en.wikipedia.org/wiki/ISO-8601>`_, i.e., weeks start
- on a Monday and the first week contains the year's first Thursday.
- Example::
- Entry.objects.filter(pub_date__week=52)
- Entry.objects.filter(pub_date__week__gte=32, pub_date__week__lte=38)
- (No equivalent SQL code fragment is included for this lookup because
- implementation of the relevant query varies among different database engines.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: week_day
- ``week_day``
- ~~~~~~~~~~~~
- For date and datetime fields, a 'day of the week' match. Allows chaining
- additional field lookups.
- Takes an integer value representing the day of week from 1 (Sunday) to 7
- (Saturday).
- Example::
- Entry.objects.filter(pub_date__week_day=2)
- Entry.objects.filter(pub_date__week_day__gte=2)
- (No equivalent SQL code fragment is included for this lookup because
- implementation of the relevant query varies among different database engines.)
- Note this will match any record with a ``pub_date`` that falls on a Monday (day
- 2 of the week), regardless of the month or year in which it occurs. Week days
- are indexed with day 1 being Sunday and day 7 being Saturday.
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: iso_week_day
- ``iso_week_day``
- ~~~~~~~~~~~~~~~~
- For date and datetime fields, an exact ISO 8601 day of the week match. Allows
- chaining additional field lookups.
- Takes an integer value representing the day of the week from 1 (Monday) to 7
- (Sunday).
- Example::
- Entry.objects.filter(pub_date__iso_week_day=1)
- Entry.objects.filter(pub_date__iso_week_day__gte=1)
- (No equivalent SQL code fragment is included for this lookup because
- implementation of the relevant query varies among different database engines.)
- Note this will match any record with a ``pub_date`` that falls on a Monday (day
- 1 of the week), regardless of the month or year in which it occurs. Week days
- are indexed with day 1 being Monday and day 7 being Sunday.
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: quarter
- ``quarter``
- ~~~~~~~~~~~
- For date and datetime fields, a 'quarter of the year' match. Allows chaining
- additional field lookups. Takes an integer value between 1 and 4 representing
- the quarter of the year.
- Example to retrieve entries in the second quarter (April 1 to June 30)::
- Entry.objects.filter(pub_date__quarter=2)
- (No equivalent SQL code fragment is included for this lookup because
- implementation of the relevant query varies among different database engines.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: time
- ``time``
- ~~~~~~~~
- For datetime fields, casts the value as time. Allows chaining additional field
- lookups. Takes a :class:`datetime.time` value.
- Example::
- Entry.objects.filter(pub_date__time=datetime.time(14, 30))
- Entry.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))
- (No equivalent SQL code fragment is included for this lookup because
- implementation of the relevant query varies among different database engines.)
- When :setting:`USE_TZ` is ``True``, fields are converted to the current time
- zone before filtering. This requires :ref:`time zone definitions in the
- database <database-time-zone-definitions>`.
- .. fieldlookup:: hour
- ``hour``
- ~~~~~~~~
- For datetime and time fields, an exact hour match. Allows chaining additional
- field lookups. Takes an integer between 0 and 23.
- Example::
- Event.objects.filter(timestamp__hour=23)
- Event.objects.filter(time__hour=5)
- Event.objects.filter(timestamp__hour__gte=12)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE EXTRACT('hour' FROM timestamp) = '23';
- SELECT ... WHERE EXTRACT('hour' FROM time) = '5';
- SELECT ... WHERE EXTRACT('hour' FROM timestamp) >= '12';
- (The exact SQL syntax varies for each database engine.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: minute
- ``minute``
- ~~~~~~~~~~
- For datetime and time fields, an exact minute match. Allows chaining additional
- field lookups. Takes an integer between 0 and 59.
- Example::
- Event.objects.filter(timestamp__minute=29)
- Event.objects.filter(time__minute=46)
- Event.objects.filter(timestamp__minute__gte=29)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE EXTRACT('minute' FROM timestamp) = '29';
- SELECT ... WHERE EXTRACT('minute' FROM time) = '46';
- SELECT ... WHERE EXTRACT('minute' FROM timestamp) >= '29';
- (The exact SQL syntax varies for each database engine.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: second
- ``second``
- ~~~~~~~~~~
- For datetime and time fields, an exact second match. Allows chaining additional
- field lookups. Takes an integer between 0 and 59.
- Example::
- Event.objects.filter(timestamp__second=31)
- Event.objects.filter(time__second=2)
- Event.objects.filter(timestamp__second__gte=31)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE EXTRACT('second' FROM timestamp) = '31';
- SELECT ... WHERE EXTRACT('second' FROM time) = '2';
- SELECT ... WHERE EXTRACT('second' FROM timestamp) >= '31';
- (The exact SQL syntax varies for each database engine.)
- When :setting:`USE_TZ` is ``True``, datetime fields are converted to the
- current time zone before filtering. This requires :ref:`time zone definitions
- in the database <database-time-zone-definitions>`.
- .. fieldlookup:: isnull
- ``isnull``
- ~~~~~~~~~~
- Takes either ``True`` or ``False``, which correspond to SQL queries of
- ``IS NULL`` and ``IS NOT NULL``, respectively.
- Example::
- Entry.objects.filter(pub_date__isnull=True)
- SQL equivalent:
- .. code-block:: sql
- SELECT ... WHERE pub_date IS NULL;
- .. fieldlookup:: regex
- ``regex``
- ~~~~~~~~~
- Case-sensitive regular expression match.
- The regular expression syntax is that of the database backend in use.
- In the case of SQLite, which has no built in regular expression support,
- this feature is provided by a (Python) user-defined REGEXP function, and
- the regular expression syntax is therefore that of Python's ``re`` module.
- Example::
- Entry.objects.get(title__regex=r"^(An?|The) +")
- SQL equivalents:
- .. code-block:: sql
- SELECT ... WHERE title REGEXP BINARY '^(An?|The) +'; -- MySQL
- SELECT ... WHERE REGEXP_LIKE(title, '^(An?|The) +', 'c'); -- Oracle
- SELECT ... WHERE title ~ '^(An?|The) +'; -- PostgreSQL
- SELECT ... WHERE title REGEXP '^(An?|The) +'; -- SQLite
- Using raw strings (e.g., ``r'foo'`` instead of ``'foo'``) for passing in the
- regular expression syntax is recommended.
- .. fieldlookup:: iregex
- ``iregex``
- ~~~~~~~~~~
- Case-insensitive regular expression match.
- Example::
- Entry.objects.get(title__iregex=r"^(an?|the) +")
- SQL equivalents:
- .. code-block:: sql
- SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL
- SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle
- SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL
- SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite
- .. _aggregation-functions:
- Aggregation functions
- ---------------------
- .. currentmodule:: django.db.models
- Django provides the following aggregation functions in the
- ``django.db.models`` module. For details on how to use these
- aggregate functions, see :doc:`the topic guide on aggregation
- </topics/db/aggregation>`. See the :class:`~django.db.models.Aggregate`
- documentation to learn how to create your aggregates.
- .. warning::
- SQLite can't handle aggregation on date/time fields out of the box.
- This is because there are no native date/time fields in SQLite and Django
- currently emulates these features using a text field. Attempts to use
- aggregation on date/time fields in SQLite will raise ``NotSupportedError``.
- .. admonition:: Empty querysets or groups
- Aggregation functions return ``None`` when used with an empty ``QuerySet``
- or group. For example, the ``Sum`` aggregation function returns ``None``
- instead of ``0`` if the ``QuerySet`` contains no entries or for any empty
- group in a non-empty ``QuerySet``. To return another value instead, define
- the ``default`` argument. ``Count`` is an exception to this behavior; it
- returns ``0`` if the ``QuerySet`` is empty since ``Count`` does not support
- the ``default`` argument.
- All aggregates have the following parameters in common:
- ``expressions``
- ~~~~~~~~~~~~~~~
- Strings that reference fields on the model, transforms of the field, or
- :doc:`query expressions </ref/models/expressions>`.
- ``output_field``
- ~~~~~~~~~~~~~~~~
- An optional argument that represents the :doc:`model field </ref/models/fields>`
- of the return value
- .. note::
- When combining multiple field types, Django can only determine the
- ``output_field`` if all fields are of the same type. Otherwise, you
- must provide the ``output_field`` yourself.
- .. _aggregate-filter:
- ``filter``
- ~~~~~~~~~~
- An optional :class:`Q object <django.db.models.Q>` that's used to filter the
- rows that are aggregated.
- See :ref:`conditional-aggregation` and :ref:`filtering-on-annotations` for
- example usage.
- .. _aggregate-default:
- ``default``
- ~~~~~~~~~~~
- An optional argument that allows specifying a value to use as a default value
- when the queryset (or grouping) contains no entries.
- ``**extra``
- ~~~~~~~~~~~
- Keyword arguments that can provide extra context for the SQL generated
- by the aggregate.
- ``Avg``
- ~~~~~~~
- .. class:: Avg(expression, output_field=None, distinct=False, filter=None, default=None, **extra)
- Returns the mean value of the given expression, which must be numeric
- unless you specify a different ``output_field``.
- * Default alias: ``<field>__avg``
- * Return type: ``float`` if input is ``int``, otherwise same as input
- field, or ``output_field`` if supplied. If the queryset or grouping is
- empty, ``default`` is returned.
- .. attribute:: distinct
- Optional. If ``distinct=True``, ``Avg`` returns the mean value of
- unique values. This is the SQL equivalent of ``AVG(DISTINCT <field>)``.
- The default value is ``False``.
- ``Count``
- ~~~~~~~~~
- .. class:: Count(expression, distinct=False, filter=None, **extra)
- Returns the number of objects that are related through the provided
- expression. ``Count('*')`` is equivalent to the SQL ``COUNT(*)``
- expression.
- * Default alias: ``<field>__count``
- * Return type: ``int``
- .. attribute:: distinct
- Optional. If ``distinct=True``, the count will only include unique
- instances. This is the SQL equivalent of ``COUNT(DISTINCT <field>)``.
- The default value is ``False``.
- .. note::
- The ``default`` argument is not supported.
- ``Max``
- ~~~~~~~
- .. class:: Max(expression, output_field=None, filter=None, default=None, **extra)
- Returns the maximum value of the given expression.
- * Default alias: ``<field>__max``
- * Return type: same as input field, or ``output_field`` if supplied. If the
- queryset or grouping is empty, ``default`` is returned.
- ``Min``
- ~~~~~~~
- .. class:: Min(expression, output_field=None, filter=None, default=None, **extra)
- Returns the minimum value of the given expression.
- * Default alias: ``<field>__min``
- * Return type: same as input field, or ``output_field`` if supplied. If the
- queryset or grouping is empty, ``default`` is returned.
- ``StdDev``
- ~~~~~~~~~~
- .. class:: StdDev(expression, output_field=None, sample=False, filter=None, default=None, **extra)
- Returns the standard deviation of the data in the provided expression.
- * Default alias: ``<field>__stddev``
- * Return type: ``float`` if input is ``int``, otherwise same as input
- field, or ``output_field`` if supplied. If the queryset or grouping is
- empty, ``default`` is returned.
- .. attribute:: sample
- Optional. By default, ``StdDev`` returns the population standard
- deviation. However, if ``sample=True``, the return value will be the
- sample standard deviation.
- ``Sum``
- ~~~~~~~
- .. class:: Sum(expression, output_field=None, distinct=False, filter=None, default=None, **extra)
- Computes the sum of all values of the given expression.
- * Default alias: ``<field>__sum``
- * Return type: same as input field, or ``output_field`` if supplied. If the
- queryset or grouping is empty, ``default`` is returned.
- .. attribute:: distinct
- Optional. If ``distinct=True``, ``Sum`` returns the sum of unique
- values. This is the SQL equivalent of ``SUM(DISTINCT <field>)``. The
- default value is ``False``.
- ``Variance``
- ~~~~~~~~~~~~
- .. class:: Variance(expression, output_field=None, sample=False, filter=None, default=None, **extra)
- Returns the variance of the data in the provided expression.
- * Default alias: ``<field>__variance``
- * Return type: ``float`` if input is ``int``, otherwise same as input
- field, or ``output_field`` if supplied. If the queryset or grouping is
- empty, ``default`` is returned.
- .. attribute:: sample
- Optional. By default, ``Variance`` returns the population variance.
- However, if ``sample=True``, the return value will be the sample
- variance.
- Query-related tools
- ===================
- This section provides reference material for query-related tools not documented
- elsewhere.
- ``Q()`` objects
- ---------------
- .. class:: Q
- A ``Q()`` object represents an SQL condition that can be used in
- database-related operations. It's similar to how an
- :class:`F() <django.db.models.F>` object represents the value of a model field
- or annotation. They make it possible to define and reuse conditions. These can
- be negated using the ``~`` (``NOT``) operator, and combined using operators
- such as ``|`` (``OR``), ``&`` (``AND``), and ``^`` (``XOR``). See
- :ref:`complex-lookups-with-q`.
- ``Prefetch()`` objects
- ----------------------
- .. class:: Prefetch(lookup, queryset=None, to_attr=None)
- The ``Prefetch()`` object can be used to control the operation of
- :meth:`~django.db.models.query.QuerySet.prefetch_related()`.
- The ``lookup`` argument describes the relations to follow and works the same
- as the string based lookups passed to
- :meth:`~django.db.models.query.QuerySet.prefetch_related()`. For example:
- .. code-block:: pycon
- >>> from django.db.models import Prefetch
- >>> Question.objects.prefetch_related(Prefetch("choice_set")).get().choice_set.all()
- <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
- # This will only execute two queries regardless of the number of Question
- # and Choice objects.
- >>> Question.objects.prefetch_related(Prefetch("choice_set"))
- <QuerySet [<Question: What's up?>]>
- The ``queryset`` argument supplies a base ``QuerySet`` for the given lookup.
- This is useful to further filter down the prefetch operation, or to call
- :meth:`~django.db.models.query.QuerySet.select_related()` from the prefetched
- relation, hence reducing the number of queries even further:
- .. code-block:: pycon
- >>> voted_choices = Choice.objects.filter(votes__gt=0)
- >>> voted_choices
- <QuerySet [<Choice: The sky>]>
- >>> prefetch = Prefetch("choice_set", queryset=voted_choices)
- >>> Question.objects.prefetch_related(prefetch).get().choice_set.all()
- <QuerySet [<Choice: The sky>]>
- The ``to_attr`` argument sets the result of the prefetch operation to a custom
- attribute:
- .. code-block:: pycon
- >>> prefetch = Prefetch("choice_set", queryset=voted_choices, to_attr="voted_choices")
- >>> Question.objects.prefetch_related(prefetch).get().voted_choices
- [<Choice: The sky>]
- >>> Question.objects.prefetch_related(prefetch).get().choice_set.all()
- <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
- .. note::
- When using ``to_attr`` the prefetched result is stored in a list. This can
- provide a significant speed improvement over traditional
- ``prefetch_related`` calls which store the cached result within a
- ``QuerySet`` instance.
- ``prefetch_related_objects()``
- ------------------------------
- .. function:: prefetch_related_objects(model_instances, *related_lookups)
- .. function:: aprefetch_related_objects(model_instances, *related_lookups)
- *Asynchronous version*: ``aprefetch_related_objects()``
- Prefetches the given lookups on an iterable of model instances. This is useful
- in code that receives a list of model instances as opposed to a ``QuerySet``;
- for example, when fetching models from a cache or instantiating them manually.
- Pass an iterable of model instances (must all be of the same class) and the
- lookups or :class:`Prefetch` objects you want to prefetch for. For example:
- .. code-block:: pycon
- >>> from django.db.models import prefetch_related_objects
- >>> restaurants = fetch_top_restaurants_from_cache() # A list of Restaurants
- >>> prefetch_related_objects(restaurants, "pizzas__toppings")
- When using multiple databases with ``prefetch_related_objects``, the prefetch
- query will use the database associated with the model instance. This can be
- overridden by using a custom queryset in a related lookup.
- ``FilteredRelation()`` objects
- ------------------------------
- .. class:: FilteredRelation(relation_name, *, condition=Q())
- .. attribute:: FilteredRelation.relation_name
- The name of the field on which you'd like to filter the relation.
- .. attribute:: FilteredRelation.condition
- A :class:`~django.db.models.Q` object to control the filtering.
- ``FilteredRelation`` is used with :meth:`~.QuerySet.annotate()` to create an
- ``ON`` clause when a ``JOIN`` is performed. It doesn't act on the default
- relationship but on the annotation name (``pizzas_vegetarian`` in example
- below).
- For example, to find restaurants that have vegetarian pizzas with
- ``'mozzarella'`` in the name:
- .. code-block:: pycon
- >>> from django.db.models import FilteredRelation, Q
- >>> Restaurant.objects.annotate(
- ... pizzas_vegetarian=FilteredRelation(
- ... "pizzas",
- ... condition=Q(pizzas__vegetarian=True),
- ... ),
- ... ).filter(pizzas_vegetarian__name__icontains="mozzarella")
- If there are a large number of pizzas, this queryset performs better than:
- .. code-block:: pycon
- >>> Restaurant.objects.filter(
- ... pizzas__vegetarian=True,
- ... pizzas__name__icontains="mozzarella",
- ... )
- because the filtering in the ``WHERE`` clause of the first queryset will only
- operate on vegetarian pizzas.
- ``FilteredRelation`` doesn't support:
- * :meth:`.QuerySet.only` and :meth:`~.QuerySet.prefetch_related`.
- * A :class:`~django.contrib.contenttypes.fields.GenericForeignKey`
- inherited from a parent model.
|