{"data":{"markdownRemark":{"html":"<h2>Field types</h2>\n<p><strong>AutoField</strong> 字段自增</p>\n<p><strong>BooleanField</strong> 布尔字段</p>\n<p><strong>CharField</strong> 字符串字段</p>\n<p><strong>DateField</strong> 日期字段</p>\n<p><strong>DateTimeField</strong> 时间日期字段</p>\n<p><strong>DecimalField</strong> Decimal字段</p>\n<p><strong>EmailField</strong> 邮箱字段</p>\n<p><strong>FilePathField</strong> 文件路径字段</p>\n<p><strong>FloatField</strong> 浮点字段</p>\n<p><strong>IntegerField</strong> 整数字段</p>\n<p><strong>IPAddressField</strong> ip地址字段</p>\n<p><strong>GenericIPAddressField</strong> ip地址字段</p>\n<p><strong>SlugField</strong> Slug字段</p>\n<p><strong>TextField</strong> 文本字段</p>\n<p><strong>TimeField</strong> 时间字段</p>\n<p><strong>URLField</strong> url字段</p>\n<p><strong>BinaryField</strong> 二进制字段</p>\n<p><strong>UUIDField</strong> uuid字段</p>\n<h2>field options</h2>\n<p><strong>verbose_name</strong> from表单显示名称</p>\n<p><strong>primary_key</strong> 主键</p>\n<p><strong>max_length</strong> 最大长度</p>\n<p><strong>blank</strong> 是否为null</p>\n<p><strong>default</strong> 默认值</p>\n<p><strong>choices</strong> 选择项</p>\n<p><strong>db_index</strong> 是否创建索引</p>\n<p><strong>db_column</strong> 列名</p>\n<p><strong>unique</strong> 是否唯一</p>\n<p><strong>editable</strong> from表单可编辑</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> django<span class=\"token punctuation\">.</span>db <span class=\"token keyword\">import</span> models\n<span class=\"token keyword\">import</span> datetime\n<span class=\"token keyword\">import</span> uuid\n<span class=\"token keyword\">from</span> django<span class=\"token punctuation\">.</span>utils <span class=\"token keyword\">import</span> timezone\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Person</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token builtin\">id</span> <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>UUIDField<span class=\"token punctuation\">(</span> primary_key<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span> default<span class=\"token operator\">=</span>uuid<span class=\"token punctuation\">.</span>uuid1<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># id = models.AutoField(primary_key=True)</span>\n    gender <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>CharField<span class=\"token punctuation\">(</span>blank<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">,</span> db_column<span class=\"token operator\">=</span><span class=\"token string\">\"gender\"</span><span class=\"token punctuation\">,</span> max_length<span class=\"token operator\">=</span><span class=\"token number\">250</span><span class=\"token punctuation\">,</span> choices<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span>\n        <span class=\"token punctuation\">(</span><span class=\"token string\">'female'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'男'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">(</span><span class=\"token string\">'male'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'女'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                              db_index<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span> default<span class=\"token operator\">=</span><span class=\"token string\">\"默认值\"</span><span class=\"token punctuation\">,</span> editable<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">,</span>\n                              error_messages<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token string\">'blank'</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'INVALID!!11'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'null'</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'NULL11!'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                              help_text<span class=\"token operator\">=</span><span class=\"token string\">\"Please use the following format: &lt;em>YYYY-MM-DD&lt;/em>.\"</span><span class=\"token punctuation\">,</span>\n                              primary_key<span class=\"token operator\">=</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">,</span> unique<span class=\"token operator\">=</span><span class=\"token boolean\">False</span>\n                              <span class=\"token punctuation\">)</span>\n    age <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>IntegerField<span class=\"token punctuation\">(</span>default<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    email <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>EmailField<span class=\"token punctuation\">(</span>default<span class=\"token operator\">=</span><span class=\"token string\">\"kastrcn@outlook.com\"</span><span class=\"token punctuation\">)</span>\n    birthday <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>DateField<span class=\"token punctuation\">(</span>default<span class=\"token operator\">=</span>datetime<span class=\"token punctuation\">.</span>date<span class=\"token punctuation\">.</span>today<span class=\"token punctuation\">)</span>\n    create_at <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>DateTimeField<span class=\"token punctuation\">(</span>verbose_name<span class=\"token operator\">=</span><span class=\"token string\">\"创建时间\"</span><span class=\"token punctuation\">,</span> default<span class=\"token operator\">=</span>timezone<span class=\"token punctuation\">.</span>now<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">class</span> <span class=\"token class-name\">Meta</span><span class=\"token punctuation\">:</span>\n        db_table <span class=\"token operator\">=</span> <span class=\"token string\">'user'</span>\n        <span class=\"token comment\"># abstract = True</span>\n        ordering <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'-gender'</span><span class=\"token punctuation\">]</span></code></pre></div>\n<h2>表关系</h2>\n<p>一对多关联</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">BookInfo</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">pass</span>\n<span class=\"token comment\">#定义英雄模型类HeroInfo</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">HeroInfo</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    hbook <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>ForeignKey<span class=\"token punctuation\">(</span><span class=\"token string\">'BookInfo'</span><span class=\"token punctuation\">)</span><span class=\"token comment\">#英雄与图书表的关系为一对多，所以属性定义在英雄模型类中</span></code></pre></div>\n<p>一对一关联</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">Place</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">pass</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Restaurant</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    place <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>OneToOneField<span class=\"token punctuation\">(</span>Place<span class=\"token punctuation\">,</span> on_delete<span class=\"token operator\">=</span>models<span class=\"token punctuation\">.</span>CASCADE<span class=\"token punctuation\">,</span>primary_key<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>多对多关联</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">TypeInfo</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n\t<span class=\"token keyword\">pass</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">NewsInfo</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n  ntype <span class=\"token operator\">=</span> models<span class=\"token punctuation\">.</span>ManyToManyField<span class=\"token punctuation\">(</span><span class=\"token string\">'TypeInfo'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>自关联</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">AreaInfo</span><span class=\"token punctuation\">(</span>models<span class=\"token punctuation\">.</span>Model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    atitle<span class=\"token operator\">=</span>models<span class=\"token punctuation\">.</span>CharField<span class=\"token punctuation\">(</span>max_length<span class=\"token operator\">=</span><span class=\"token number\">30</span><span class=\"token punctuation\">)</span><span class=\"token comment\">#名称</span>\n    aParent<span class=\"token operator\">=</span>models<span class=\"token punctuation\">.</span>ForeignKey<span class=\"token punctuation\">(</span><span class=\"token string\">'self'</span><span class=\"token punctuation\">,</span>null<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>blank<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span><span class=\"token comment\">#关系</span></code></pre></div>\n<h2>QuerySets</h2>\n<p><strong>查询最后一条记录 返回model对象</strong>\n<code class=\"language-text\">Role.objects.last()</code></p>\n<p><strong>查询第一条记录 返回model对象</strong>\n<code class=\"language-text\">Role.objects.first()</code></p>\n<p><strong>获取主键为1的记录 返回model对象</strong>\n<code class=\"language-text\">Role.objects.get(pk=1)</code></p>\n<p><strong>查询id等于1的记录  返回model对象集合</strong>\n<code class=\"language-text\">Role.objects.filter(id=1)</code></p>\n<p><strong>查询id等于1 name等于默认角色的记录 返回model对象集合</strong>\n<code class=\"language-text\">Role.objects.filter(id=1, name=&quot;默认角色&quot;)</code></p>\n<p><strong>查询id等于1 name等于默认角色的记录 返回键值对集合</strong>\n<code class=\"language-text\">Role.objects.filter(id=1, name=&quot;默认角色&quot;).values()</code></p>\n<p><strong>查询id等于1 name等于默认角色的记录 返回只包含id的键值对集合</strong>\n<code class=\"language-text\">Role.objects.filter(id=1, name=&quot;默认角色&quot;).values(&#39;id&#39;)</code></p>\n<p><strong>查询Role所有id 返回id元组集合</strong>\n<code class=\"language-text\">Role.objects.values_list(&quot;id&quot;)</code></p>\n<p><strong>查询Role所有id 返回id元组集合 以id倒叙排序</strong>\n<code class=\"language-text\">Role.objects.values_list(&quot;id&quot;).order_by(&#39;-id&#39;)</code></p>\n<p><strong>查询Role所有id 根据id去重 返回id元组集合</strong>\n<code class=\"language-text\">Role.objects.distinct(&quot;id&quot;).values_list(&quot;id&quot;)</code></p>\n<p><strong>查询Role所有id 根据id去重 返回id元组集合</strong>\n<code class=\"language-text\">Role.objects.values_list(&quot;id&quot;).order_by(&#39;-id&#39;).distinct(&#39;id&#39;)</code></p>\n<h3>values和values_list</h3>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">&gt;&gt;&gt; Role.objects.values(&quot;id&quot;,&quot;name&quot;)\n&lt;QuerySet [{&#39;id&#39;: 1, &#39;name&#39;: &#39;默认角色&#39;}, {&#39;id&#39;: 2, &#39;name&#39;: &#39;默认角色&#39;}, {&#39;id&#39;: 3, &#39;name&#39;: &#39;默认角色&#39;}, {&#39;id&#39;: 4, &#39;name&#39;: &#39;默认角色&#39;}]&gt;\nRole.objects.values(&quot;id&quot;,&quot;name&quot;)[0][&quot;id&quot;]\n&lt;class &#39;dict&#39;&gt;\n\n\n&gt;&gt;&gt; Role.objects.values_list(&quot;id&quot;,&quot;name&quot;)\n&lt;QuerySet [(1, &#39;默认角色&#39;), (2, &#39;默认角色&#39;), (3, &#39;默认角色&#39;), (4, &#39;默认角色&#39;)]&gt;\nRole.objects.values_list(&quot;id&quot;, &quot;name&quot;)[0][0]\n&lt;class &#39;tuple&#39;&gt;</code></pre></div>\n<h3>QuerySet转SQL</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>Role<span class=\"token punctuation\">.</span>objects<span class=\"token punctuation\">.</span>values_list<span class=\"token punctuation\">(</span><span class=\"token string\">\"id\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"name\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>query<span class=\"token punctuation\">)</span>\n<span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>Role<span class=\"token punctuation\">.</span>objects<span class=\"token punctuation\">.</span>values_list<span class=\"token punctuation\">(</span><span class=\"token string\">\"id\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"name\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>query<span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># SELECT \"app_role\".\"id\", \"app_role\".\"name\" FROM \"app_role\"</span></code></pre></div>\n<h3>flat字段 多个字段无效</h3>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">&gt;&gt;&gt; Entry.objects.values_list(&#39;id&#39;).order_by(&#39;id&#39;)\n&lt;QuerySet[(1,), (2,), (3,), ...]&gt;\n\n&gt;&gt;&gt; Entry.objects.values_list(&#39;id&#39;, flat=True).order_by(&#39;id&#39;)\n&lt;QuerySet [1, 2, 3, ...]&gt;</code></pre></div>\n<h3>json序列化</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> django<span class=\"token punctuation\">.</span>core <span class=\"token keyword\">import</span> serializers\nserialized_obj <span class=\"token operator\">=</span> serializers<span class=\"token punctuation\">.</span>serialize<span class=\"token punctuation\">(</span><span class=\"token string\">'json'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>user<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>","frontmatter":{"title":"Object-relational mapper"}}},"pageContext":{"slug":"/build/repo/Django/1、ORM/"}}