20 lines
4.8 KiB
HTML
20 lines
4.8 KiB
HTML
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="X-UA-Compatible" content="IE=edge"><title> Django Manager Method · MarkDown</title><meta name="description" content="Django Manager Method - Ching"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="short icon" href="/favicon.png"><link rel="stylesheet" href="/css/apollo.css"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600" type="text/css"><meta name="generator" content="Hexo 6.0.0"><link rel="alternate" href="/atom.xml" title="MarkDown" type="application/atom+xml">
|
||
</head><body><header><a href="/" class="logo-link"><img src="/logo.png"></a><ul class="nav nav-list"><li class="nav-list-item"><a href="/" target="_self" class="nav-list-link">ALL</a></li><li class="nav-list-item"><a href="/categories/leetcode/" target="_self" class="nav-list-link">LEETCODE</a></li><li class="nav-list-item"><a href="/atom.xml" target="_self" class="nav-list-link">RSS</a></li></ul></header><section class="container"><div class="post"><article class="post-block"><h1 class="post-title">Django Manager Method</h1><div class="post-meta"><div class="post-time">2016年4月25日</div></div><div class="post-content"><h4 id="Django-Manager"><a href="#Django-Manager" class="headerlink" title="Django Manager"></a>Django Manager</h4><p>Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。</p>
|
||
<p>eg.</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.db <span class="keyword">import</span> models</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Person</span>(<span class="params">models.Model</span>):</span></span><br><span class="line"> ...</span><br><span class="line"> people = models.Manager()</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>上面这个 model,<code>Person.objects</code>会产生一个<code>AttributeError</code>,但是<code>Person.people</code>就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。</p>
|
||
<h4 id="自定义-Manager"><a href="#自定义-Manager" class="headerlink" title="自定义 Manager"></a>自定义 Manager</h4><p>通常需要自定义 manager 的情况有两点:</p>
|
||
<ol>
|
||
<li>需要修改/扩展 Django 的 manager 方法</li>
|
||
<li>需要修改返回的 QuerySet</li>
|
||
</ol>
|
||
<h4 id="默认-Manager"><a href="#默认-Manager" class="headerlink" title="默认 Manager"></a>默认 Manager</h4><p>如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。</p>
|
||
<p>笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。</p>
|
||
<p>eg.</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Book</span>(<span class="params">models.Model</span>):</span></span><br><span class="line"> title = models.CharField(max_length=<span class="number">100</span>)</span><br><span class="line"> author = models.CharField(max_length=<span class="number">50</span>)</span><br><span class="line"> </span><br><span class="line"> objects = models.Manager() <span class="comment"># default manager</span></span><br><span class="line"> custom_objects = CustomBOokManager() <span class="comment"># custom manager</span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p><a target="_blank" rel="noopener" href="http://blog.csdn.net/sicofield/article/details/49283751">source</a></p>
|
||
</div></article></div></section><footer><div class="paginator"><a href="/2016/05/04/Tastypie/" class="prev">PRVE</a><a href="/2016/02/16/Flask-Day-2/" class="next">NEXT</a></div><div class="copyright"><p>© 2016 - 2022 <a href="http://blog.tunpok.com">Ching</a>, unless otherwise noted.</p></div></footer><script src="https://cdn.bootcss.com/mathjax/2.5.3/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script></body></html> |