{"title":"Conas cuardaigh saincheaptha a scríobh","version":"6.1","locale":"ga","docname":"howto/custom-lookups","url":"/ga/6.1/howto/custom-lookups/","canonical":"https://djangodocs.dev/ga/6.1/howto/custom-lookups/","summary":"Cuireann Django <field-lookups>réimse leathan de: ref: cuardaigh ionsuite `ar fáil le haghaidh scagadh (mar shampla, ``cruth` agus ``icontains`).","html":"<h1>Conas cuardaigh saincheaptha a scríobh<a class=\"heading-anchor\" href=\"#how-to-write-custom-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Cuireann Django &lt;field-lookups&gt;réimse leathan de: ref: cuardaigh ionsuite `ar fáil le haghaidh scagadh (mar shampla, ``cruth` agus <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>icontains`). Míníonn an doiciméadú seo conas cuardaigh saincheaptha a scríobh agus conas obair na gcuardaigh atá ann cheana a athrú. Le haghaidh tagairtí API de chuardaigh, féach an:doc: /ref/models/lookups.</p>\n<section id=\"a-lookup-example\">\n<h2>Sampla cuardaigh<a class=\"heading-anchor\" href=\"#a-lookup-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tosaímid le cuardach beag saincheaptha. Scríobhfaimid cuardach saincheaptha <code class=\"docutils literal notranslate\">ne</code> a oibríonn os coinne <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>cruinn `. Aistreoidh <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>Author.Objects.Filter (name__ne='Jack') <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a>go dtí an SQL:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"ss\">&quot;author&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;name&quot;</span> <span class=\"o\">&lt;&gt;</span> <span class=\"s1\">&#39;Jack&#39;</span>\n</code></pre></div>\n<p>Tá an SQL seo neamhspleách ar chúltaca, mar sin ní gá dúinn a bheith buartha faoi bhunachair sonraí éagsúla.</p>\n<p>Tá dhá chéim ann chun an obair seo a dhéanamh. Ar dtús ní mór dúinn an cuardach a chur i bhfeidhm, ansin ní mór dúinn a insint do Django faoi:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Lookup\n\n\n<span class=\"k\">class</span> <span class=\"nc\">NotEqual</span><span class=\"p\">(</span>Lookup<span class=\"p\">):</span>\n    lookup_name <span class=\"o\">=</span> <span class=\"s2\">&quot;ne&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">as_sql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">):</span>\n        lhs<span class=\"p\">,</span> lhs_params <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>process_lhs<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">)</span>\n        rhs<span class=\"p\">,</span> rhs_params <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>process_rhs<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">)</span>\n        params <span class=\"o\">=</span> lhs_params <span class=\"o\">+</span> rhs_params\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> &lt;&gt; </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>lhs<span class=\"p\">,</span> rhs<span class=\"p\">),</span> params\n</code></pre></div>\n<p>Chun an cuardach <code class=\"docutils literal notranslate\">NoteQual</code> a chlárú beidh orainn glaoch ar register_lookup` ar an rang réimse a theastaíonn uainn go mbeadh an cuardach ar fáil dó. Sa chás seo, bíonn ciall ag an cuardach ar gach fo-aicme <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Field`, mar sin cláraímid é le <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>Field` go díreach:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Field\n\nField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>NotEqual<span class=\"p\">)</span>\n</code></pre></div>\n<p>Is féidir clárú cuardaigh a dhéanamh freisin ag baint úsáide as patrún maisitheora:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Field\n\n\n<span class=\"nd\">@Field</span><span class=\"o\">.</span>register_lookup\n<span class=\"k\">class</span> <span class=\"nc\">NotEqualLookup</span><span class=\"p\">(</span>Lookup<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Is féidir linn <code class=\"docutils literal notranslate\">foo__ne</code> a úsáid anois le haghaidh aon réimse <code class=\"docutils literal notranslate\">foo</code>. Beidh ort a chinntiú go dtarlaíonn an clárú seo sula ndéanann tú iarracht aon cheisteanna a chruthú ag baint úsáide as. D'fhéadfá an cur i bhfeidhm a chur i gcomhad <code class=\"docutils literal notranslate\">models.py`, nó an cuardach a chlárú sa mhodh ``ready () ``de `AppConfig</code>.</p>\n<p>Ag breathnú níos dlúithe ar an gcur i bhfeidhm, is é lookup_name` an chéad tréith riachtanach. Ligeann sé seo don ORM tuiscint a fháil ar conas <code class=\"docutils literal notranslate\">name__ne</code> a léirmhíniú agus <code class=\"docutils literal notranslate\">NoteQual</code> a úsáid chun an SQL a ghiniúint. De réir choinbhinsiúin, is teaghráin bheaga iad na hainmneacha seo i gcónaí nach bhfuil ach litreacha ann, ach is é an t-aon cheanglas crua ná nach gcaithfidh an teaghrán <code class=\"docutils literal notranslate\">__</code> a bheith ann.</p>\n<p>We then need to define the <code class=\"docutils literal notranslate\">as_sql</code> method. This takes a <code class=\"docutils literal notranslate\">SQLCompiler</code>\nobject, called <code class=\"docutils literal notranslate\">compiler</code>, and the active database connection.\n<code class=\"docutils literal notranslate\">SQLCompiler</code> objects are not documented, but the only thing we need to know\nabout them is that they have a <code class=\"docutils literal notranslate\">compile()</code> method which returns a tuple\ncontaining an SQL string, and the parameters to be interpolated into that\nstring. In most cases, you don't need to use it directly and can pass it on to\n<code class=\"docutils literal notranslate\">process_lhs()</code> and <code class=\"docutils literal notranslate\">process_rhs()</code>.</p>\n<p>Oibríonn <code class=\"docutils literal notranslate\">Lookup</code> i gcoinne dhá luach, lhs` agus <code class=\"docutils literal notranslate\">rhs</code>, ag seasamh ar thaobh na láimhe clé agus ar dheis. &lt;query-expression&gt;Is tagairt réimse é an taobh na láimhe clé de ghnáth, ach is féidir é a bheith ina rud ar bith a chur i bhfeidhm an:ref: abairt fiosraithe API `. Is é an lámh dheis an luach a thugann an t-úsáideoir. Sa sampla ``Author.Objects.Filter (name__ne='Jack') `, is tagairt é an taobh clé don réimse <code class=\"docutils literal notranslate\">ainm</code> den tsamhail <code class=\"docutils literal notranslate\">Author ``, agus ``Jack'</code> is é an taobh na láimhe deise.</p>\n<p>Glaoimid ar <code class=\"docutils literal notranslate\">process_lhs</code> agus <code class=\"docutils literal notranslate\">process_rhs</code> chun iad a thiontú ina luachanna a theastaíonn uainn le haghaidh SQL ag baint úsáide as an réad <code class=\"docutils literal notranslate\">compiler</code> a thuairiscítear roimhe seo. Tugann na modhanna seo tuples ina bhfuil roinnt SQL agus na paraiméadair atá le hidirphóladh isteach sa SQL sin, díreach mar is gá dúinn filleadh ónár modh as_sql`. Sa sampla thuas, filleann <code class=\"docutils literal notranslate\">process_lhs</code> <code class=\"docutils literal notranslate\">('&quot;údar”. ainm&quot;', []) ``agus ``process_rhs</code> filleann`` ('&quot;%s&quot;', ['Jack']) <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>. Sa sampla seo ní raibh aon pharaiméadair ann don taobh clé, ach bheadh sé seo ag brath ar an réad atá againn, mar sin ní mór dúinn iad a áireamh sna paraiméadair a fhilleann muid fós.</p>\n<p>Faoi dheireadh, déanaimid na codanna a chomhcheangal i abairt SQL le &lt;&gt;`, agus soláthraímid na paraiméadair go léir don cheist. Ansin cuirimid tuple ar ais ina bhfuil an teaghrán SQL a ghintear agus na paraiméadair.</p>\n</section>\n<section id=\"a-transformer-example\">\n<h2>Sampla claochladáin<a class=\"heading-anchor\" href=\"#a-transformer-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Tá an cuardach saincheaptha thuas iontach, ach i gcásanna áirithe b'fhéidir gur mhaith leat a bheith in ann cuardaigh a shlánú le chéile. Mar shampla, is dóigh linn go bhfuilimid ag tógáil feidhmchlár áit ar mhaith linn úsáid a bhaint as an oibreoir <code class=\"docutils literal notranslate\">abs () ``. Tá samhail ``Turgnamh</code> againn a thaifeadann luach tosaigh, luach deiridh, agus an t-athrú (tús - deireadh). Ba mhaith linn gach turgnamh a fháil nuair a bhí an t-athrú cothrom le méid áirithe (Experiment.Objects.filter (change__abs = 27) `), nó nuair nár sháraigh sé méid áirithe (<code class=\"docutils literal notranslate\">Experiment.Objects.Filter (change__abs__lt=27)</code>).</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Tá an sampla seo dírithe beagán, ach léiríonn sé go deas an raon feidhmiúlachta atá indéanta ar bhealach neamhspleách cúltaca bunachar sonraí, agus gan feidhmiúlacht a dhúbailt cheana féin i Django.</p>\n</aside>\n<p>Tosóimid trí chlaochladán <code class=\"docutils literal notranslate\">Absolutevalue</code> a scríobh. Úsáidfidh sé seo an fheidhm SQL <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>ABS () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>chun an luach a athrú roimh chomparáid:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Transform\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AbsoluteValue</span><span class=\"p\">(</span>Transform<span class=\"p\">):</span>\n    lookup_name <span class=\"o\">=</span> <span class=\"s2\">&quot;abs&quot;</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;ABS&quot;</span>\n</code></pre></div>\n<p>Ansin, déanaimis é a chlárú le haghaidh <code class=\"docutils literal notranslate\">IntegerField</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> IntegerField\n\nIntegerField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>AbsoluteValue<span class=\"p\">)</span>\n</code></pre></div>\n<p>Is féidir linn anois na ceisteanna a bhí againn roimhe seo a rith. Ghinfidh <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Experiment.Objects.Filter (change__abs = 27) <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>an SQL seo a leanas:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">ABS</span><span class=\"p\">(</span><span class=\"ss\">&quot;experiments&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;change&quot;</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"mi\">27</span>\n</code></pre></div>\n<p>Trí <code class=\"docutils literal notranslate\">Transform</code> a úsáid in ionad <code class=\"docutils literal notranslate\">Lookup</code> ciallaíonn sé go bhfuilimid in ann cuardaigh breise a shlánú ina dhiaidh sin. Mar sin, ginfidh <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Experiment.Objects.filter (change__abs__lt = 27) <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>an SQL seo a leanas:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">ABS</span><span class=\"p\">(</span><span class=\"ss\">&quot;experiments&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;change&quot;</span><span class=\"p\">)</span> <span class=\"o\">&lt;</span> <span class=\"mi\">27</span>\n</code></pre></div>\n<p>Tabhair faoi deara, i gcás nach bhfuil aon chuardach eile sonraithe ann, léirmhíníonn Django <code class=\"docutils literal notranslate\">change__abs = 27</code> mar <code class=\"docutils literal notranslate\">change__abs__exact=27</code>.</p>\n<p>Ligeann sé seo freisin an toradh a úsáid i gclásail <code class=\"docutils literal notranslate\">ORDER BY</code> agus DISTINCT ON`. Mar shampla <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Experiment.Objects.Order_by ('change__abs') <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>gineann:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">ORDER</span> <span class=\"k\">BY</span> <span class=\"k\">ABS</span><span class=\"p\">(</span><span class=\"ss\">&quot;experiments&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;change&quot;</span><span class=\"p\">)</span> <span class=\"k\">ASC</span>\n</code></pre></div>\n<p>Agus ar bhunachair sonraí a thacaíonn le réimsí ar leith (mar shampla PostgreSQL), gineann <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Experiment.Objects.Distinct ('change__abs') <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">DISTINCT</span> <span class=\"k\">ON</span> <span class=\"k\">ABS</span><span class=\"p\">(</span><span class=\"ss\">&quot;experiments&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;change&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Agus tú ag lorg cé na cuardaigh atá incheadaithe tar éis an <code class=\"docutils literal notranslate\">Transform` `a chur i bhfeidhm, úsáideann Django an tréith ``output_field`. Ní raibh gá dúinn é seo a shonrú anseo mar níor athraigh sé, ach ag glacadh go raibh “AbsoluteValue” á chur i bhfeidhm ar réimse éigin a léiríonn cineál níos casta (mar shampla pointe i gcoibhneas le bunús, nó uimhir chasta) ansin b'fhéidir gur theastaigh uainn a shonrú go dtugann an claochlú cineál `Floatfield` le haghaidh tuilleadh cuardaigh. Is féidir é seo a dhéanamh trí thréith ``output_field</code> a chur leis an gclaochlú:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> FloatField<span class=\"p\">,</span> Transform\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AbsoluteValue</span><span class=\"p\">(</span>Transform<span class=\"p\">):</span>\n    lookup_name <span class=\"o\">=</span> <span class=\"s2\">&quot;abs&quot;</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;ABS&quot;</span>\n\n    <span class=\"nd\">@property</span>\n    <span class=\"k\">def</span> <span class=\"nf\">output_field</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> FloatField<span class=\"p\">()</span>\n</code></pre></div>\n<p>Cinntíonn sé seo go n-iompraíonn cuardaigh breise mar <code class=\"docutils literal notranslate\">abs__lte</code> mar a dhéanfaidís do <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Floatfield <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>.</p>\n</section>\n<section id=\"writing-an-efficient-abs-lt-lookup\">\n<h2>Cuardach éifeachtach <code class=\"docutils literal notranslate\">abs__lt</code> a scríobh<a class=\"heading-anchor\" href=\"#writing-an-efficient-abs-lt-lookup\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agus an cuardach 'abs' scríofa thuas á úsáid agat, ní úsáidfidh an SQL a tháirgtear innéacsanna go héifeachtúil i gcásanna áirithe. Go háirithe, nuair a úsáidimid <code class=\"docutils literal notranslate\">change__abs__lt=27</code>, tá sé seo comhionann le <code class=\"docutils literal notranslate\">change__gt=-27</code> AGUS <code class=\"docutils literal notranslate\">change__lt=27</code>. (Maidir leis an gcás <code class=\"docutils literal notranslate\">lte</code> d'fhéadfaimis an SQL <code class=\"docutils literal notranslate\">BETWEEN</code> a úsáid).</p>\n<p>Mar sin ba mhaith linn <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Experiment.Objects.filter (change__abs__lt = 27) <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>an SQL seo a leanas a ghiniúint:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"p\">..</span> <span class=\"k\">WHERE</span> <span class=\"ss\">&quot;experiments&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;change&quot;</span> <span class=\"o\">&lt;</span> <span class=\"mi\">27</span> <span class=\"k\">AND</span> <span class=\"ss\">&quot;experiments&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;change&quot;</span> <span class=\"o\">&gt;</span> <span class=\"o\">-</span><span class=\"mi\">27</span>\n</code></pre></div>\n<p>Is é seo a leanas an cur chun feidhme:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Lookup\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AbsoluteValueLessThan</span><span class=\"p\">(</span>Lookup<span class=\"p\">):</span>\n    lookup_name <span class=\"o\">=</span> <span class=\"s2\">&quot;lt&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">as_sql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">):</span>\n        lhs<span class=\"p\">,</span> lhs_params <span class=\"o\">=</span> compiler<span class=\"o\">.</span>compile<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>lhs<span class=\"o\">.</span>lhs<span class=\"p\">)</span>\n        rhs<span class=\"p\">,</span> rhs_params <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>process_rhs<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">)</span>\n        params <span class=\"o\">=</span> lhs_params <span class=\"o\">+</span> rhs_params <span class=\"o\">+</span> lhs_params <span class=\"o\">+</span> rhs_params\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> &lt; </span><span class=\"si\">%s</span><span class=\"s2\"> AND </span><span class=\"si\">%s</span><span class=\"s2\"> &gt; -</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>lhs<span class=\"p\">,</span> rhs<span class=\"p\">,</span> lhs<span class=\"p\">,</span> rhs<span class=\"p\">),</span> params\n\n\nAbsoluteValue<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>AbsoluteValueLessThan<span class=\"p\">)</span>\n</code></pre></div>\n<p>Tá cúpla rud suntasach ar siúl. Ar dtús, níl <code class=\"docutils literal notranslate\">Absolutevaluelessthan</code> ag glaoch ar <code class=\"docutils literal notranslate\">process_lhs () ``. Ina áit sin scipeann sé claochlú na `lhs</code> arna dhéanamh ag <code class=\"docutils literal notranslate\">AbsoluteValue</code> agus úsáideann sé an lhs` bunaidh. Is é sin, ba mhaith linn “turgnaimh” a fháil.” athraigh “<code class=\"docutils literal notranslate\">ní ``ABS (“turgnaimh”.” athrú”) ``. Tá tagairt dhíreach do `self.lhs.lhs</code> sábháilte mar ní féidir rochtain a fháil ar <code class=\"docutils literal notranslate\">AbsoluteValuelessthan</code> ach ón gcuardach <code class=\"docutils literal notranslate\">AbsoluteValue</code>, is é sin an lhs` is sampla de AbsoluteValue` i gcónaí.</p>\n<p>Tabhair faoi deara freisin toisc go n-úsáidtear an dá thaobh arís agus arís agus arís eile sa cheist go gcaithfidh lhs_params` agus rhs_params` a bheith sna paramaí arís agus arís eile.</p>\n<p>Déanann an cheist deiridh an t-inbhrú (<code class=\"docutils literal notranslate\">27</code> go -27`) go díreach sa bhunachar sonraí. Is é an chúis atá leis seo a dhéanamh ná más rud éigin eile é an <code class=\"docutils literal notranslate\">self.rhs</code> seachas luach slámhshláir simplí (mar shampla tagairt <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>F () <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>) ní féidir linn na claochlú a dhéanamh i Python.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Déanta na fírinne, d'fhéadfaí an chuid is mó de na cuardaigh le <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>__abs <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>a chur i bhfeidhm mar cheisteanna raon mar seo, agus ar fhormhór na gcúltaca bunachar sonraí is dóichí go mbeidh sé níos ciallmhaire é sin a dhéanamh mar is féidir leat úsáid a bhaint as na hinnéacsanna. Mar sin féin le PostgreSQL b'fhéidir gur mhaith leat innéacs a chur leis ar <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">`</span></a>abs (athrú) <a href=\"#id7\"><span class=\"problematic\" id=\"id8\">``</span></a>a ligfeadh na ceisteanna seo a bheith an-éifeachtach.</p>\n</aside>\n</section>\n<section id=\"a-bilateral-transformer-example\">\n<h2>Sampla claochladáin déthaobh<a class=\"heading-anchor\" href=\"#a-bilateral-transformer-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Is é an sampla <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>AbsoluteValue` a phléamar roimhe seo ná claochlú a bhaineann leis an taobh clé den chuardach. D'fhéadfadh go mbeadh roinnt cásanna ann inar mian leat an claochlú a chur i bhfeidhm ar an taobh clé agus ar an taobh deise araon. Mar shampla, más mian leat tacar fiosrúcháin a scagadh bunaithe ar chomhionannas an taobh clé agus na láimhe deise go neamhíogair do roinnt feidhm SQL.</p>\n<p>Déanaimis scrúdú ar chlaochlú cás-neamh-íogair Níl an claochlú seo an-úsáideach go praiticiúil toisc go dtagann dornán cuardaigh cás-neamh-íogair ionsuite le Django cheana féin, ach beidh sé ina léiriú deas ar chlaochlú déthaobhacha ar bhealach agnasach bunachar sonraí.</p>\n<p>Sainmhínímid claochladán <code class=\"docutils literal notranslate\">Uppercase</code> a úsáideann an fheidhm SQL <code class=\"docutils literal notranslate\">UPPER () ``chun na luachanna a athrú roimh chomparáid. Sainmhínímid: attr: `déthaobhach = Fíor &lt;django.db.models.Transform.bilateral&gt;`chun a léiriú gur chóir go mbeadh feidhm ag an gclaochlú seo le `lhs</code> agus rhs` araon:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Transform\n\n\n<span class=\"k\">class</span> <span class=\"nc\">UpperCase</span><span class=\"p\">(</span>Transform<span class=\"p\">):</span>\n    lookup_name <span class=\"o\">=</span> <span class=\"s2\">&quot;upper&quot;</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;UPPER&quot;</span>\n    bilateral <span class=\"o\">=</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>Ansin, déanaimis é a chlárú:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> CharField<span class=\"p\">,</span> TextField\n\nCharField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>UpperCase<span class=\"p\">)</span>\nTextField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>UpperCase<span class=\"p\">)</span>\n</code></pre></div>\n<p>Anois, ginfidh an tacar ceisteanna <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>Author.Objects.Filter (name__upper=&quot;doe”) <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>ceist neamh-íogair cás mar seo:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">SELECT</span> <span class=\"p\">...</span> <span class=\"k\">WHERE</span> <span class=\"k\">UPPER</span><span class=\"p\">(</span><span class=\"ss\">&quot;author&quot;</span><span class=\"p\">.</span><span class=\"ss\">&quot;name&quot;</span><span class=\"p\">)</span> <span class=\"o\">=</span> <span class=\"k\">UPPER</span><span class=\"p\">(</span><span class=\"s1\">&#39;doe&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"writing-alternative-implementations-for-existing-lookups\">\n<h2>Forfheidhmithe malartacha a scríobh le haghaidh cuardaigh atá ann<a class=\"heading-anchor\" href=\"#writing-alternative-implementations-for-existing-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Uaireanta éilíonn díoltóirí bunachar sonraí éagsúla SQL éagsúla don oibríocht chéanna. Mar shampla seo athscríobhfaimid cur i bhfeidhm saincheaptha do MySQL don oibreoir NotEqual. In ionad <code class=\"docutils literal notranslate\">&lt;&gt;</code> beimid ag úsáid <code class=\"docutils literal notranslate\">!=</code> oibreoir. (Tabhair faoi deara i ndáiríre go dtacaíonn beagnach gach bunachar sonraí leis an dá cheann, lena n-áirítear na bunachair shonraí oifigiúla go léir a fhaigheann tacaíocht ó Django).</p>\n<p>Is féidir linn an t-iompar ar chúltaca ar leith a athrú trí fho-aicme de NoteQual` a chruthú le modh as_mysql`:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MySQLNotEqual</span><span class=\"p\">(</span>NotEqual<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">as_mysql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> compiler<span class=\"p\">,</span> connection<span class=\"p\">,</span> <span class=\"o\">**</span>extra_context<span class=\"p\">):</span>\n        lhs<span class=\"p\">,</span> lhs_params <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>process_lhs<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">)</span>\n        rhs<span class=\"p\">,</span> rhs_params <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>process_rhs<span class=\"p\">(</span>compiler<span class=\"p\">,</span> connection<span class=\"p\">)</span>\n        params <span class=\"o\">=</span> lhs_params <span class=\"o\">+</span> rhs_params\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> != </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>lhs<span class=\"p\">,</span> rhs<span class=\"p\">),</span> params\n\n\nField<span class=\"o\">.</span>register_lookup<span class=\"p\">(</span>MySQLNotEqual<span class=\"p\">)</span>\n</code></pre></div>\n<p>Ansin is féidir linn é a chlárú le <code class=\"docutils literal notranslate\">Field`. Tógann sé in áit an aicme bunaidh ``NoteQual</code> mar tá an lookup_name` céanna aige.</p>\n<p>Agus ceist á thiomsú, féachann Django ar dtús modhanna <code class=\"docutils literal notranslate\">as_%s% connection.vendor</code>, agus ansin titeann sé ar ais chuig <code class=\"docutils literal notranslate\">as_sql</code>. Is iad na hainmneacha díoltóra do na cúltaca ionsuite ná sqlite`, postgresql`, <code class=\"docutils literal notranslate\">oracle</code> agus <code class=\"docutils literal notranslate\">mysql</code>.</p>\n</section>\n<section id=\"how-django-determines-the-lookups-and-transforms-which-are-used\">\n<h2>Conas a chinneann Django na cuardaigh agus na hathshruithe a úsáidtear<a class=\"heading-anchor\" href=\"#how-django-determines-the-lookups-and-transforms-which-are-used\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>I gcásanna áirithe b'fhéidir gur mhaith leat a athrú go dinimiciúil cén <code class=\"docutils literal notranslate\">Transform</code> nó <code class=\"docutils literal notranslate\">Lookup</code> ar ais bunaithe ar an ainm a chuirtear isteach, seachas é a shocrú. Mar shampla, d'fhéadfá réimse a bheith agat a stóráilíonn comhordanáidí nó gné treallach, agus ba mhaith leat comhréir mar .filter (coords__x7=4) `a cheadú chun na rudaí a thabhairt ar ais ina bhfuil luach 4 ag an 7ú comhordú. D'fhonn é seo a dhéanamh, dhéanfá ``get_lookup` a shárú le rud éigin mar:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">CoordinatesField</span><span class=\"p\">(</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_lookup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> lookup_name<span class=\"p\">):</span>\n        <span class=\"k\">if</span> lookup_name<span class=\"o\">.</span>startswith<span class=\"p\">(</span><span class=\"s2\">&quot;x&quot;</span><span class=\"p\">):</span>\n            <span class=\"k\">try</span><span class=\"p\">:</span>\n                dimension <span class=\"o\">=</span> <span class=\"nb\">int</span><span class=\"p\">(</span>lookup_name<span class=\"o\">.</span>removeprefix<span class=\"p\">(</span><span class=\"s2\">&quot;x&quot;</span><span class=\"p\">))</span>\n            <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n                <span class=\"k\">pass</span>\n            <span class=\"k\">else</span><span class=\"p\">:</span>\n                <span class=\"k\">return</span> get_coordinate_lookup<span class=\"p\">(</span>dimension<span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_lookup<span class=\"p\">(</span>lookup_name<span class=\"p\">)</span>\n</code></pre></div>\n<p>Ansin shainmhíníodh <code class=\"docutils literal notranslate\">get_coordinate_lookup</code> go cuí chun fo-aicme <code class=\"docutils literal notranslate\">Lookup</code> a thabhairt ar ais a dhéileálann luach ábhartha <code class=\"docutils literal notranslate\">tois</code>.</p>\n<p>Tá modh ainmnithe mar an gcéanna ar a dtugtar <code class=\"docutils literal notranslate\">get_transformer () ``. Ba chóir go gcuirfeadh ``get_lookup () ``fo-aicme ``Lookup</code> a thabhairt ar ais i gcónaí, agus <code class=\"docutils literal notranslate\">get_transformer ()</code> fo-aicme <code class=\"docutils literal notranslate\">Transform</code>. Tá sé tábhachtach a mheabhrú gur féidir rudaí Transform' a scagadh tuilleadh orthu, agus ní féidir rudaí ``Lookup`.</p>\n<p>Agus tú ag scagadh, mura bhfuil ach ainm cuardaigh amháin fágtha le réiteach, cuirfimid ag lorg <code class=\"docutils literal notranslate\">Lookup</code>. Má tá ainmneacha iolracha ann, cuardóidh sé <code class=\"docutils literal notranslate\">Transform` `. Sa chás nach bhfuil ach ainm amháin ann agus nach bhfaightear ``Lookup</code>, cuirimid ag lorg <code class=\"docutils literal notranslate\">Transform</code> agus ansin an cuardach <code class=\"docutils literal notranslate\">`cruth</code> ar an Transform` sin. Críochnaíonn gach seicheamh glaonna le <code class=\"docutils literal notranslate\">Lookup</code> i gcónaí. Chun soiléiriú:</p>\n<ul class=\"simple\">\n<li><p>Glaofar <code class=\"docutils literal notranslate\">.filter (myfield__mylookup) ```myfield.get_lookup ('mylookup')</code>.</p></li>\n<li><p>Tabharfaidh .filter (myfield__mytransform__mylookup) ``glaoch ar ``myfield.get_transformer ('mytransformer')`, agus ansin <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>mytransform.get_lookup ('mylookup') <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>.</p></li>\n<li><p>Glaofar <code class=\"docutils literal notranslate\">.filter (myfield__mytransformer) ``ar dtús ``myfield.get_lookup ('mytransformer')</code>, a theipeann air, mar sin tithfidh sé ar ais ar <code class=\"docutils literal notranslate\">myfield.get_transformer ('mytransformer') ``agus ansin ``mytransform.get_lookup ('éacht')</code>.</p></li>\n</ul>\n</section>","rootId":"how-to-write-custom-lookups","toc":[{"title":"Sampla cuardaigh","anchor":"a-lookup-example","children":[]},{"title":"Sampla claochladáin","anchor":"a-transformer-example","children":[]},{"title":"Cuardach éifeachtach abs__lt a scríobh","anchor":"writing-an-efficient-abs-lt-lookup","children":[]},{"title":"Sampla claochladáin déthaobh","anchor":"a-bilateral-transformer-example","children":[]},{"title":"Forfheidhmithe malartacha a scríobh le haghaidh cuardaigh atá ann","anchor":"writing-alternative-implementations-for-existing-lookups","children":[]},{"title":"Conas a chinneann Django na cuardaigh agus na hathshruithe a úsáidtear","anchor":"how-django-determines-the-lookups-and-transforms-which-are-used","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Treoracha conas","url":"/ga/6.1/howto/"}],"prev":{"docname":"howto/writing-migrations","title":"Conas imirce bunachar sonraí a chruthú","url":"/ga/6.1/howto/writing-migrations/"},"next":{"docname":"howto/outputting-csv","title":"Conas aschur CSV a chruthú","url":"/ga/6.1/howto/outputting-csv/"},"formats":{"html":"/ga/6.1/howto/custom-lookups/","markdown":"/ga/6.1/howto/custom-lookups.md","json":"/ga/6.1/howto/custom-lookups.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/howto/custom-lookups.txt","official":"https://docs.djangoproject.com/ga/6.1/howto/custom-lookups/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}