Optamú ar rochtain bunacharLink to this heading
Soláthraíonn ciseal bunachar sonraí Django bealaí éagsúla chun cabhrú le forbróirí an leas is fearr a bhaint as a mbunachar Bailíonn an doiciméad seo naisc leis an doiciméad ábhartha le chéile, agus cuireann sé leideanna éagsúla leis, eagraithe faoi roinnt ceannteidil a thugann cur síos ar na céimeanna atá le glacadh agus tú ag iarraidh úsáid do bhunachar sonraí a
Próifíl ar dtúsLink to this heading
Mar chleachtas cláraithe ginearálta, téann sé seo gan rá. <faq-see-raw-sql-queries>Faigh amach: ref: cad iad na ceisteanna atá á dhéanamh agat agus cad a chosnaíonn siad duit `. Úsáid: Meth: `.querySet.explain chun tuiscint a fháil ar cé chomh sonrach a fhorghníomhaíonn do bhunachar sonraí QuerySets. B'fhéidir gur mhaith leat tionscadal seachtrach a úsáid freisin cosúil:pypi: django-debug-toolbar, nó uirlis a dhéanann monatóireacht díreach ar do bhunachar sonraí.
Cuimhnigh go bhféadfadh tú a bheith ag barrfheabhsú le haghaidh luas nó cuimhne nó araon, ag brath ar do riachtanais Uaireanta beidh barrfheabhsú do cheann amháin díobhálach don cheann eile, ach uaireanta cabhróidh siad lena chéile. Chomh maith leis sin, b'fhéidir nach mbeadh an costas céanna (duitse) ag an obair a dhéanann an próiseas bunachar sonraí leis an méid céanna oibre a dhéantar i do phróiseas Python. Is fútsa atá sé cinneadh a dhéanamh cad iad do thosaíochtaí, cá gcaithfidh an t-iarmhéid a bheith, agus iad seo go léir a phróifíliú de réir mar is gá ós rud é go mbeidh sé seo ag brath ar d'iarratas agus ar d'fhre
Le gach rud a leanann, cuimhnigh próifíl a dhéanamh tar éis gach athraithe chun a chinntiú gur sochar é an t-athrú, agus sochar mór go leor i bhfianaise an laghdú ar inléiteacht do chód. ** Tagann gach ceann de na moltaí thíos leis an rabhadh go bhféadfadh an prionsabal ginearálta a bheith i bhfeidhm i do chúinsí, nó go bhféadfadh sé a aisiompú fiú.
Bain úsáid as teicnící caighdeánachaLink to this heading
... lena n-áirítear:
Innéacsai. Is tosaíocht uimhir a haon é seo, * ina dhiaithe* tá cinneadh agat ó phróifíliú cad iad na hinnéacsanna ba chóir a chur leis. <django.db.models.Field.db_index>Úsáid: attr: Meta.Indexes <django.db.models.Options.indexes>`nó: attr: `Field.db_index chun iad seo a chur leis ó Django. Smaoinigh ar innéacsanna a chur le réimsí a fhiosraíonn tú go minic ag baint úsáide:meth: ~django.db.models.query.queryset.filter () `, :meth: `~django.db.models.query.queryset.Excluded (), :meth: `~django.db.models.queryset.order_by () `, srl. d'fhéadfadh innéacsanna cabhrú le cuardach a bhrostú. Tabhair faoi deara gur ábhar casta atá ag brath ar bhunachar sonraí é na hinnéacsanna is fearr a chinneadh a bheidh ag brath ar d'iarratas ar leith. Féadfaidh lasaird a bhaineann le hinnéacs a chothabháil níos mó ná aon ghnóthachain i luas ceisteanna.
Úsáid chuí de chineálacha réimse.
Glacfaimid leis go ndearna tú na rudaí atá liostaithe thuas. Díríonn an chuid eile den doiciméad seo ar conas Django a úsáid sa chaoi nach bhfuil tú ag déanamh obair gan ghá. Ní thugann an doiciméad seo aghaidh freisin ar theicnící optamaithe eile a bhaineann le gach oibríocht daor, mar shampla:doc: taiscáil cuspóir ginear</topics/cache> álta.
Tuiscint a fháil ar QuerySetsLink to this heading
Tuiscint: doc: Tá QuerySets </ref/models/querysets> ríthábhachtach chun feidhmíocht mhaith a fháil le cód simplí. Go háirithe:
Meastóireacht ``QuerySet ``a thuiscintLink to this heading
Chun fadhbanna feidhmíochta a sheachaint, tá sé tábhachtach tuiscint:
Tréithe taiscéadta a thuiscintLink to this heading
Chomh maith le caistriú an ``QuerySet ``iomlán, tá toradh tréithe ar rudaí ORM a chaitheamh a chaitheamh. Go ginearálta, déanfar tréithe nach féidir glaoch a stóráil. <queryset-model-example>Mar shampla, ag glacadh leis na:ref: `samplaí blag samplacha `:
>>> entry = Entry.objects.get(id=1)
>>> entry.blog # Blog object is retrieved at this point
>>> entry.blog # cached version, no DB access
Ach go ginearálta, is cúis le tréithe inghlaonta cuardach DB gach uair:
>>> entry = Entry.objects.get(id=1)
>>> entry.authors.all() # query performed
>>> entry.authors.all() # query performed again
Bí cúramach agus tú ag léamh cód teimpléid - ní cheadaíonn an córas teimpléid lúibíní a úsáid, ach glaoifidh sé glaonna go huathoibríoch, ag folach an t-idirdhealú thuas.
Bí cúramach le d'airíonna saincheaptha féin - is fútsa atá sé caching a chur i bhfeidhm nuair is gá, mar shampla ag baint úsáide as an maisitheoir: class: ~django.utils.functional.cached_property.
Úsáid an chlib teimpléad ``with`Link to this heading
Chun úsáid a bhaint as iompar caching ``QuerySet ``, b'fhéidir go mbeidh ort an chlib teimpléad:ttag: with a úsáid.
Úsáid ``iterator () ``Link to this heading
Nuair a bhíonn a lán rudaí agat, is féidir le hiompar caching an ``QuerySet ``a bheith ina chúis le cuimhne mór a úsáid. Sa chás seo, d'fhéadfadh :meth: `~django.db.models.query.queryset.iterator () `cabhrú.
Úsáid ``mhínigh () ``Link to this heading
QuerySet.explain() gives you detailed information about how the database
executes a query, including indexes and joins that are used. These details may
help you find queries that could be rewritten more efficiently, or identify
indexes that could be added to improve performance.
An oibríonn bunachar sonraí sa bhunachar sonraí seachas i PythonLink to this heading
Mar shampla:
Ag an leibhéal is bunúsaí, bain úsáid as: ref: `scagadh agus eisiamh <queryset-api>`chun scagadh a dhéanamh sa bhunachar sonraí.
Úsáid: aicme: abairtí `F <django.db.models.F>`chun scagadh bunaithe ar réimsí eile laistigh den tsamhail chéanna.
Úsáid:doc: `anótáil chun comhiomlánú a dhéanamh sa bhunachar sonraithe' </topics/db/aggregation>.
Mura leor iad seo chun an SQL a theastaíonn uait a ghiniúint:
Úsáid RawsqlLink to this heading
Modh nach bhfuil chomh iniompartha ach níos cumhachtaí ná an léir:class: ~Django.db.Models.Expressions.RawSql, a ligeann roinnt SQL a chur go sainráite leis an bhfiosrúchán. Mura bhfuil sé sin cumhachtach go leor fós:
Úsáid SQL amhLink to this heading
Scríobh do chuid féin: doc: SQL saincheaptha chun sonraí a aisghabháil nó samhlacha a dhaonrú '</topics/db/sql>. Úsáid ``django.db.connection.queries` chun a fháil amach cad atá ag scríobh Django duit agus tosú as sin.
Aisghabháil rudaí aonair ag úsáid colún uathúil, innéacsaitheLink to this heading
Tá dhá chúis ann le colún a úsáid le:attr: ~django.db.models.field.unique nó:attr: ~django.db.models.field.db_index agus tú ag úsáid: meth: ~django.db.models.queryset.get chun rudaí aonair a aisghabháil. Ar dtús, beidh an cheist níos gasta mar gheall ar an innéacs bunachar sonraí bunúsach. Chomh maith leis sin, d'fhéadfadh an cheist rith i bhfad níos moille má mheaitseálann ilrudaí leis an lorg; ráthaíonn srian uathúil a bheith agat ar an gcolún nach dtarlóidh sé seo riamh.
<queryset-model-example>Mar sin ag baint úsáide as an: ref: `sampla samhlacha blag `:
>>> entry = Entry.objects.get(id=10)
beidh sé níos gasta ná:
>>> entry = Entry.objects.get(headline="News Item Title")
toisc go ndéanann an bunachar sonraí innéacsaithe ``id ``agus ráthaítear go mbeidh sé uathúil.
D'fhéadfadh sé go mbeadh sé mall go leor na nithe seo a leanas
>>> entry = Entry.objects.get(headline__startswith="News")
Ar an gcéad dul síos, ní innéacsaítear ``ceannlíne ``, rud a fhágfaidh go bhfaighidh an bunachar sonraí bunúsach níos moille.
Ar an dara dul síos, ní ráthaíonn an cuardach nach gcuirfear ach rud amháin ar ais. Má mheaitseálann an ceist níos mó ná réad amháin, aisghabharfaidh sé agus aistríonn sé iad go léir ón mbunachar sonraí. D'fhéadfadh an pionós seo a bheith suntasach má chuirtear na céadta nó na mílte taifid ar ais. Cuirfear an pionós i measc má tá an bunachar sonraí ina gcónaí ar fhreastalaí ar leithligh, áit a mbíonn fachtóir ag lasbhreas agus latency líonra freisin.
Aisghabháil gach rud ag an am céanna má tá a fhios agat go mbeidh sé uaitLink to this heading
Go ginearálta, níl sé chomh héifeachtach an bunachar sonraí a bhualadh arís agus arís eile do chodanna éagsúla de 'tacar' sonraí amháin a bheidh ag teastáil uait gach cuid díobh ná iad go léir a aisghabháil in aon cheist amháin. Tá sé seo tábhachtach go háirithe má tá ceist agat a fhorghníomhaítear i lúb, agus dá bhrí sin d'fhéadfadh go leor ceisteanna bunachar sonraí a dhéanamh, nuair nach raibh ach ceann amháin ag teastáil. Mar sin:
Ná aisghabháil rudaí nach dteastaíonn uaitLink to this heading
Úsáid QuerySet.values () ``agus ``values_list ()Link to this heading
Nuair nach dteastaíonn uait ach dict nó ``liosta ``de luachanna, agus nach dteastaíonn rudaí samhail ORM uait, bain úsáid chuí de:meth: `~django.db.models.query.queryset.values () `. Is féidir leo seo a bheith úsáideach chun rudaí samhail a athsholáthar i gcód teimpléid - fad is a bhíonn na tréithe céanna ag na dicts a sholáthraíonn tú leo siúd a úsáidtear sa teimpléad, tá tú go breá.
Úsáid QuerySet.defer () ``agus ``only ()Link to this heading
Úsáid:Meth: ~django.db.models.query.queryset.defer () `agus:meth: `~django.db.models.query.queryset.only () má tá colúin bunachar sonraí ann nach mbeidh a fhios agat nach mbeidh ort (nó nach mbeidh gá uait i bhformhór na gcásanna) chun iad a luchtú a sheachaint. Tabhair faoi deara má úsáideann t* iad, beidh ar an ORM dul agus iad a fháil i bhfiosrú ar leithligh, rud a fhágann go bhfuil sé seo ina mhíchuí má úsáideann tú é go míchuí.
Ná bí ró-ionsaitheach agus réimsí a chur ar iarchur gan próifíliú mar caithfidh an bunachar sonraí an chuid is mó de na sonraí neamh-téacs, neamh-Varchar a léamh ón diosca ar feadh sraith amháin sna torthaí, fiú mura gcríochnaíonn sé ach cúpla colún á úsáid. Tá na modhanna defer () ``agus ``only () is úsáideach nuair is féidir leat a lán sonraí téacs a luchtú a sheachaint nó do réimsí a d'fhéadfadh go leor próiseála a thógáil chun tiontú ar ais go Python. Mar is gnách, próifíl ar dtús, ansin barrfheabhsú.
Úsáid ``QuerySet.contents (obj) ``Link to this heading
... mura dteastaíonn uait ach a fháil amach an bhfuil obj ``sa tacar fiosrúcháin, seachas ``if obj in iarratas.
Úsáid ``QuerySet.count () ``Link to this heading
... mura dteastaíonn uait ach an comhaireamh, seachas `len (queryset) ``a dhéanamh.
Úsáid ``QuerySet.exists () ``Link to this heading
... mura dteastaíonn uait ach a fháil amach an bhfuil toradh amháin ar a laghad ann, seachas ``if queryset ``.
Ach:
Ná ró-úsáid tá () ``, `count (), agus ann ()Link to this heading
Má tá sonraí eile ag teastáil uait ón QuerySet, déan iad a mheas láithreach.
Mar shampla, ag glacadh le samhail Grúpa a bhfuil gaol go leor aige le ``Úsáideoir ``, is fearr an cód seo a leanas:
members = group.members.all()
if display_group_members:
if members:
if current_user in members:
print("You and", len(members) - 1, "other users are members of this group.")
else:
print("There are", len(members), "members in this group.")
for member in members:
print(member.username)
else:
print("There are no members in this group.")
Tá sé is fearr mar gheall ar:
Ós rud é go bhfuil QuerySets leisciúil, ní dhéanann sé seo aon cheisteanna bunachar sonraí má tá
display_group_membersFalse`.Trí stóráil
group.members.all () ``sa athróg ``membersis féidir a taisce torthaí a athúsáid.Tá an líne
if comhaltaí: ``is cúis le ``QuerySet. __bool__ () ``le glaoch, rud a fhágann go ndéanfar an ceist ``group.members.all ()a reáchtáil ar an mbunachar sonraí. Mura bhfuil aon torthaí ann, cuirfidh sé ar aisFalse, ar shlí eileTrue.Seiceálann an líne ``if current_user i gcomhaltaí: ``an bhfuil an t-úsáideoir sa taisce torthaí, mar sin ní eisítear aon cheisteanna breise bunachar sonraí.
Glaonn úsáid ``len (comhaltaí) ``QuerySet. __len__ () `, ag athúsáid taisce na dtorthaí, mar sin arís, ní eisítear aon cheisteanna bunachar sonraí.
Athraíonn an lúb for ball` thar taisce na torthaí.
San iomlán, déanann an cód seo ceisteanna bunachar sonraí amháin nó nialas. Is é an t-aon bharrfheabhsú d'aon ghnó a dhéantar ná an athróg baill ``a úsáid. Ag baint úsáide as ``QuerySet.exists () ``don `if, QuerySet.contents () ```, `in, nó ``QuerySet.count () ``don chomhaireamh bheadh ceisteanna breise ina chúis le ceisteanna breise.
Úsáid QuerySet.Update () ``agus ``delete ()Link to this heading
<topics-db-queries-update>Seachas ualach rudaí a aisghabháil, socraigh roinnt luachanna, agus iad a shábháil aonair, bain úsáid as ráiteas mórchóir SQL UPDATE, trí:ref: `QuerySet.update () `. <topics-db-queries-delete>Ar an gcaoi chéanna, déan:ref: `bulk scriosann `nuair is féidir.
Tabhair faoi deara, áfach, nach féidir leis na modhanna mór-nuashonraithe seo na modhanna save () ``nó ``delete () cásanna aonair a ghlaoch, rud a chiallaíonn nach gcuirfear aon iompar saincheaptha a chuir tú leis do na modhanna seo a fhorghníomhú, lena n-áirítear aon rud atá tiomáinte ón ngnáthréad bunachar sonraí: doc: signals </ref/signals>.
Úsáid luachanna eachtracha go díreachLink to this heading
Mura dteastaíonn uait ach luach eochair eachtrach, bain úsáid as an eochairluach eachtrach atá ar an réad atá agat cheana féin, seachas an réad gaolmhar iomlán a fháil agus a phríomh-eochair a ghlacadh. ie déan:
entry.blog_id
in ionad:
entry.blog.id
Ná ordaigh torthaí mura bhfuil cúram ortLink to this heading
Níl ordú saor in aisce; is oibríocht é gach réimse le hordú leis an mbunachar sonraí a dhéanamh. Má tá ordú réamhshocraithe ag samhail (:attr: Meta.Ordering <django.db.models.Options.ordering>) agus mura bhfuil sé de dhíth ort, bain é ar QuerySet trí ghlaoch ar: meth: ~django.db.models.query.queryset.order_by () gan aon pharaiméadair.
D'fhéadfadh innéacs a chur le do bhunachar sonraí cabhrú le feidhmíocht ordaithe a fheabhsú
Úsáid modhanna mórchóirLink to this heading
Úsáid modhanna mórchóir chun líon na ráitis SQL a laghdú.
Cruthaigh ar an mórchóirLink to this heading
Agus rudaí á chruthú agat, nuair is féidir, bain úsáid as an modh:meth: `~django.db.models.query.queryset.bulk_create () `chun líon na gceisteanna SQL a laghdú. Mar shampla:
Entry.objects.bulk_create(
[
Entry(headline="This is a test"),
Entry(headline="This is only a test"),
]
)
... is fearr ná:
Entry.objects.create(headline="This is a test")
Entry.objects.create(headline="This is only a test")
Tabhair faoi deara go bhfuil roinnt de: meth: rabhadh don mhodh seo <django.db.models.query.QuerySet.bulk_create>, mar sin déan cinnte go bhfuil sé oiriúnach do do chás úsáide.
Nuashonrú i mórchóirLink to this heading
Agus rudaí á nuashonrú agat, nuair is féidir, bain úsáid as an modh:meth: `~django.db.models.query.queryset.bulk_update () `chun líon na gceisteanna SQL a laghdú. Mar gheall ar liosta nó tacar fiosrúcháin rudaí:
entries = Entry.objects.bulk_create(
[
Entry(headline="This is a test"),
Entry(headline="This is only a test"),
]
)
An sampla seo a leanas:
entries[0].headline = "This is not a test"
entries[1].headline = "This is no longer a test"
Entry.objects.bulk_update(entries, ["headline"])
... is fearr ná:
entries[0].headline = "This is not a test"
entries[0].save()
entries[1].headline = "This is no longer a test"
entries[1].save()
Tabhair faoi deara go bhfuil roinnt de: meth: rabhadh don mhodh seo <django.db.models.query.QuerySet.bulk_update>, mar sin déan cinnte go bhfuil sé oiriúnach do do chás úsáide.
Cuir isteach sa mórchóirLink to this heading
Agus rudaí á chur isteach ion:class: ManyTomanyFields <django.db.models.ManyToManyField>, bain úsáid as: meth: ~Django.db.Models.Fields.Related.RelatedManager.Add le rudaí iolracha chun líon na gceisteanna SQL a laghdú. Mar shampla:
my_band.members.add(me, my_friend)
... is fearr ná:
my_band.members.add(me)
my_band.members.add(my_friend)
...where Band and Artist are models with a many-to-many relationship.
Agus péirí éagsúla rudaí á chur isteach chuig: class: ~django.db.models.manyToManyField nó nuair a shainmhínítear an tábla saincheap:attr: ~django.db.models.manyToManyField.through, bain úsáid as: meth: `~Django.db.models.queryset.bulk_create () `modh chun líon na gceisteanna SQL a laghdú. Mar shampla:
PizzaToppingRelationship = Pizza.toppings.through
PizzaToppingRelationship.objects.bulk_create(
[
PizzaToppingRelationship(pizza=my_pizza, topping=pepperoni),
PizzaToppingRelationship(pizza=your_pizza, topping=pepperoni),
PizzaToppingRelationship(pizza=your_pizza, topping=mushroom),
],
ignore_conflicts=True,
)
... is fearr ná:
my_pizza.toppings.add(pepperoni)
your_pizza.toppings.add(pepperoni, mushroom)
... áit a bhfuil caidreamh go leor ag Pizza` agus Topping. Tabhair faoi deara go bhfuil roinnt de: meth: rabhadh don mhodh seo <django.db.models.query.QuerySet.bulk_create>, mar sin déan cinnte go bhfuil sé oiriúnach do do chás úsáide.
Bain ar an mórchóirLink to this heading
Agus rudaí á bhaint as: class: ManyTomanyFields <django.db.models.ManyToManyField>, bain úsáid as: meth: ~Django.db.Models.Fields.Related.RelatedManager.Remove le rudaí iolracha chun líon na gceisteanna SQL a laghdú. Mar shampla:
my_band.members.remove(me, my_friend)
... is fearr ná:
my_band.members.remove(me)
my_band.members.remove(my_friend)
...where Band and Artist are models with a many-to-many relationship.
Agus péirí éagsúla rudaí á bhaint ó:class: ManyTomanyFields <django.db.models.ManyToManyField>, bain úsáid as: meth: ~django.db.models.queryset.delete ar a:class: ~django.db.models.q léiriú le iolr:attr: ~django.db.models.manyToManyField.through cásanna samhail chun líon na gceisteanna SQL a laghdú. Mar shampla:
from django.db.models import Q
PizzaToppingRelationship = Pizza.toppings.through
PizzaToppingRelationship.objects.filter(
Q(pizza=my_pizza, topping=pepperoni)
| Q(pizza=your_pizza, topping=pepperoni)
| Q(pizza=your_pizza, topping=mushroom)
).delete()
... is fearr ná:
my_pizza.toppings.remove(pepperoni)
your_pizza.toppings.remove(pepperoni, mushroom)
... áit a bhfuil caidreamh go leor ag Pizza` agus Topping.