{"id":388,"date":"2018-12-20T04:33:22","date_gmt":"2018-12-19T12:33:22","guid":{"rendered":"https:\/\/chenbing.name\/?p=388"},"modified":"2020-05-22T14:42:26","modified_gmt":"2020-05-22T06:42:26","slug":"django1-11%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a8%a1%e5%9e%8bmodel%e5%ae%9e%e7%8e%b0%e8%bd%af%e5%88%a0%e9%99%a4%ef%bc%88%e9%80%bb%e8%be%91%e5%88%a0%e9%99%a4%ef%bc%89","status":"publish","type":"post","link":"https:\/\/chenbing.name\/blog\/388\/","title":{"rendered":"django1.11\u81ea\u5b9a\u4e49\u6a21\u578bmodel\u5b9e\u73b0\u8f6f\u5220\u9664\uff08\u903b\u8f91\u5220\u9664\uff09"},"content":{"rendered":"<p>\u9996\u5148\u9e23\u8c22\uff1a <br \/>\n<a href=\"https:\/\/blog.csdn.net\/q1242027878\/article\/details\/74906780\">https:\/\/blog.csdn.net\/q1242027878\/article\/details\/74906780<\/a>  <br \/>\n<a href=\"https:\/\/blog.csdn.net\/anonymous_qsh\/article\/details\/79838985\">https:\/\/blog.csdn.net\/anonymous_qsh\/article\/details\/79838985<\/a><\/p>\n<h2 id=\"\u73af\u5883\"><span class=\"ez-toc-section\" id=\"%E7%8E%AF%E5%A2%83\"><\/span>\u73af\u5883<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Django 1.11 <br \/>\npython:3.6<\/p>\n<h2 id=\"\u7f18\u7531\"><span class=\"ez-toc-section\" id=\"%E7%BC%98%E7%94%B1\"><\/span>\u7f18\u7531<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u603b\u662f\u4e0d\u80fd\u628a\u6570\u636e\u4e4b\u95f4\u5220\u9664\uff0c\u90fd\u662f\u5728\u4e00\u4e2a\u5b57\u6bb5\u91cc\u9762\u505a\u6807\u8bb0\u3002 <br \/>\ndjango orm\u7684delete\u65b9\u6cd5\u662f\u76f4\u63a5\u5220\u9664\uff0c\u6211\u4eec\u590d\u5199\u6b21\u65b9\u6cd5\u53ef\u4ee5\u5b9e\u73b0\u3002 <br \/>\n\u5982\u5728app.model\u4e2d\u8fd9\u6837\u5b9e\u73b0\uff1a<\/p>\n<div data-mode=\"python\">\n<pre><code>class SomeModelDemo(models.Model):\n    created_at = models.DateTimeField(\"\u521b\u5efa\u65f6\u95f4\",auto_now_add=True)\n    updated_at = models.DateTimeField(\"\u66f4\u65b0\u65f6\u95f4\",auto_now=True)\n    deleted_at = models.DateTimeField(\"\u5220\u9664\u65f6\u95f4\",null=True,default=False)\n\n    def delete(self, using=None, keep_parents=False):\n        self.deleted_at = True\n        self.save()<\/code><\/pre>\n<\/div>\n<p>\u4f46\u662f\u5462\uff0c <br \/>\n1\u3001\u6bcf\u6b21\u90fd\u8fd9\u6837\u624b\u52a8\u7ed9\u8868\u52a0\u4e00\u4e2a\u5b57\u6bb5\uff0c\u8d85\u7ea7\u9ebb\u70e6\uff0c\u4e5f\u4e0d\u4f18\u96c5\uff1b <br \/>\n2\u3001\u53ef\u80fd\u8fd8\u662f\u7ecf\u5e38\u5fd8\u8bb0\u67e5\u8be2\u6570\u636e\u7684\u65f6\u5019\u8fc7\u6ee4<code>default=True<\/code>,\u53cd\u590d\u6539\u6765\u6539\u53bb\uff0c\u8d39\u65f6\u8d39\u529b\u3002<\/p>\n<p>so\uff0c <br \/>\n\u6211\u4eec\u5e72\u8106\u53c2\u8003\u4e24\u4f4d\u540c\u5b66\u7684\u65b9\u6cd5\u5e76\u589e\u5f3a\uff0c\u4e00\u6b21\u6027\u5230\u4f4d\u3002<\/p>\n<h2 id=\"\u5b9e\u73b0\"><span class=\"ez-toc-section\" id=\"%E5%AE%9E%E7%8E%B0\"><\/span>\u5b9e\u73b0<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\u5728\u6839\u76ee\u5f55utils\u6587\u4ef6\u5939\u4e2d\u521b\u5efa\u4e00\u4e2a<code>django_softdelete_model.py<\/code><\/li>\n<\/ul>\n<div data-mode=\"python\">\n<pre><code>from django.db import models\nfrom django.db.models.query import QuerySet\n\n\n# \u81ea\u5b9a\u4e49\u903b\u8f91\u5220\u9664model\u7c7b\uff0cBegin\uff1a\nclass SoftDeleteQuerySet(QuerySet):\n    def delete(self):\n        self.update(is_deleted=True)\n\n\nclass SoftDeleteManager(models.Manager):\n    \"\"\"\n    \u4ec5\u8fd4\u56de\u672a\u88ab\u5220\u9664\u7684\u5b9e\u4f8b\n    \"\"\"\n    _queryset_class = SoftDeleteQuerySet\n\n    def get_queryset(self):\n        \"\"\"\n        \u5728\u8fd9\u91cc\u5904\u7406\u4e00\u4e0bQuerySet, \u7136\u540e\u8fd4\u56de\u6ca1\u88ab\u6807\u8bb0\u4f4dis_deleted\u7684QuerySet\n        \"\"\"\n        kwargs = {'model': self.model, 'using': self._db}\n        if hasattr(self, '_hints'):\n            kwargs['hints'] = self._hints\n\n        return self._queryset_class(**kwargs).filter(is_deleted=False)\n\n\nclass SoftDeleteModel(models.Model):\n    \"\"\"\n    \u62bd\u8c61\u7c7b\uff0c\u6dfb\u52a0is_deleted \u5b57\u6bb5\n    \"\"\"\n    is_deleted = models.BooleanField(default=False)\n\n    class Meta:\n        abstract = True\n\n    objects = SoftDeleteManager()\n\n    def delete(self, using=None, soft=True, *args, **kwargs):\n        \"\"\"\n        \u8fd9\u91cc\u9700\u8981\u771f\u5220\u9664\u7684\u8bddsoft=False\u5373\u53ef\n        \"\"\"\n        if soft:\n            self.is_deleted = True\n            self.save(using=using)\n        else:\n            return super(SoftDeleteModel, self).delete(using=using, *args, **kwargs)\n\n# \u81ea\u5b9a\u4e49\u903b\u8f91\u5220\u9664model\u7c7b\uff0cEnd\u3002\n<\/code><\/pre>\n<\/div>\n<ul>\n<li>\u5728\u5e94\u7528\u4e2d\u521b\u5efa\u6a21\u578b\u65f6\uff0c\u7ee7\u627f\u6b64\u81ea\u5b9a\u4e49\u7684<code>SoftDeleteModel<\/code>\u6a21\u578b\u7c7b\uff0c\u5982\uff1a<\/li>\n<\/ul>\n<div data-mode=\"python\">\n<pre><code>from django.db import models\nfrom extra_apps.utils.django_softdelete_model import SoftDeleteModel\n\nfrom user.models import UserProfile\n\n\n# Create your models here.\nclass CardStyle(SoftDeleteModel):\n    \"\"\"\n    \u540d\u7247\u6837\u5f0f\u8868\n    \"\"\"\n    style_id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='\u6837\u5f0fid', help_text=\"\u540d\u7247\u6837\u5f0fid\")\n    style_name = models.CharField(max_length=50, null=False, blank=False, verbose_name='\u6837\u5f0f\u540d\u79f0', help_text=\"\u540d\u7247\u6837\u5f0f\u540d\u79f0\")\n\n    create_date = models.DateTimeField(auto_now_add=True, verbose_name='\u521b\u5efa\u65f6\u95f4')\n    update_date = models.DateTimeField(auto_now=True, verbose_name='\u66f4\u65b0\u65f6\u95f4')\n\n    class Meta:\n        verbose_name = '\u540d\u7247\u6837\u5f0f'    # \u6a21\u578b\u522b\u540d\n        verbose_name_plural = '\u6837\u5f0f\u7ba1\u7406'   # \u6a21\u578b\u522b\u540d\u590d\u6570\n        db_table = 'card_style'<\/code><\/pre>\n<\/div>\n<ul>\n<li>makemigrations migrate \u4e4b\u540e\uff0c\u6570\u636e\u5e93\u8868\u90fd\u4f1a\u9ed8\u8ba4\u52a0\u4e0a<code>is_deleted<\/code>\u5b57\u6bb5\uff1b<\/li>\n<li>\u5728\u4f7f\u7528orm\u67e5\u8be2\u7684\u65f6\u5019\uff0c\u4e0d\u4f1a\u67e5\u8be2\u51fa<code>is_deleted=True<\/code>\u7684\u6570\u636e\uff1b<\/li>\n<li>\u4f7f\u7528delete()\u65b9\u6cd5\u7684\u65f6\u5019\uff0c\u4e0d\u4f1a\u5220\u9664\u6570\u636e\uff0c\u53ea\u662fupdate <code>is_deleted=True<\/code>\u3002<\/li>\n<\/ul>\n<h4 id=\"\u81f3\u6b64\uff0c\u628a\u5404\u79cd\u7a0b\u5ea6\u7684\u81ea\u5b9a\u4e49\u8f6f\u5220\u9664\u5b9e\u73b0\u90fd\u8bb2\u89e3\u4e86\uff0c\u5404\u4f4d\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u9700\u8981\uff0c\u6765\u9009\u62e9\u4f7f\u7528\u4e86\u3002\"><span class=\"ez-toc-section\" id=\"%E8%87%B3%E6%AD%A4%EF%BC%8C%E6%8A%8A%E5%90%84%E7%A7%8D%E7%A8%8B%E5%BA%A6%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BD%AF%E5%88%A0%E9%99%A4%E5%AE%9E%E7%8E%B0%E9%83%BD%E8%AE%B2%E8%A7%A3%E4%BA%86%EF%BC%8C%E5%90%84%E4%BD%8D%E5%90%8C%E5%AD%A6%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E8%87%AA%E5%B7%B1%E7%9A%84%E9%9C%80%E8%A6%81%EF%BC%8C%E6%9D%A5%E9%80%89%E6%8B%A9%E4%BD%BF%E7%94%A8%E4%BA%86%E3%80%82\"><\/span>\u81f3\u6b64\uff0c\u628a\u5404\u79cd\u7a0b\u5ea6\u7684\u81ea\u5b9a\u4e49\u8f6f\u5220\u9664\u5b9e\u73b0\u90fd\u8bb2\u89e3\u4e86\uff0c\u5404\u4f4d\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u9700\u8981\uff0c\u6765\u9009\u62e9\u4f7f\u7528\u4e86\u3002<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><wiz_tmp_tag id=\"wiz-table-range-border\" contenteditable=\"false\" style=\"display: none;\"><\/p>\n<div id=\"wiz-table-col-line\" style=\"display: none;\"><\/div>\n<div id=\"wiz-table-row-line\" style=\"display: none;\"><\/div>\n<div id=\"wiz-table-range-border_start\" style=\"display: none;\">\n<div id=\"wiz-table-range-border_start_top\"><\/div>\n<div id=\"wiz-table-range-border_start_right\"><\/div>\n<div id=\"wiz-table-range-border_start_bottom\"><\/div>\n<div id=\"wiz-table-range-border_start_left\"><\/div>\n<div id=\"wiz-table-range-border_start_dot\"><\/div>\n<\/div>\n<div id=\"wiz-table-range-border_range\" style=\"display: none;\">\n<div id=\"wiz-table-range-border_range_top\"><\/div>\n<div id=\"wiz-table-range-border_range_right\"><\/div>\n<div id=\"wiz-table-range-border_range_bottom\"><\/div>\n<div id=\"wiz-table-range-border_range_left\"><\/div>\n<div id=\"wiz-table-range-border_range_dot\"><\/div>\n<\/div>\n<p><\/wiz_tmp_tag><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148\u9e23\u8c22\uff1a https:\/\/blog.csdn.net\/q1242027878\/article\/details\/74906780 https:\/\/blog.csdn.net\/anonymous_qsh\/article\/details\/79838985 \u73af\u5883 Django 1.11 python:3.6 \u7f18\u7531 \u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u603b\u662f\u4e0d\u80fd\u628a\u6570\u636e\u4e4b\u95f4\u5220\u9664\uff0c\u90fd\u662f\u5728\u4e00\u4e2a\u5b57\u6bb5&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[86,4],"tags":[33,61,60,59],"class_list":["post-388","post","type-post","status-publish","format-standard","hentry","category-python","category-skill","tag-django","tag-model","tag-60","tag-59"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/posts\/388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/comments?post=388"}],"version-history":[{"count":1,"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/posts\/388\/revisions"}],"predecessor-version":[{"id":688,"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/posts\/388\/revisions\/688"}],"wp:attachment":[{"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/media?parent=388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/categories?post=388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chenbing.name\/blog\/wp-json\/wp\/v2\/tags?post=388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}