{
  "version": "https://jsonfeed.org/version/1", 
  "title": "Django", 
  "description": "Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.", 
  "home_page_url": "https://www.v2ex.com/go/django", 
  "feed_url": "https://www.v2ex.com/feed/django.json", 
  "icon": "https://cdn.v2ex.com/navatar/6636/8270/431_large.png?m=1647775006", 
  "favicon": "https://cdn.v2ex.com/navatar/6636/8270/431_normal.png?m=1647775006", 
  "items": [
    {
      "author": {
        "url": "https://www.v2ex.com/member/mixuxin", 
        "name": "mixuxin", 
        "avatar": "https://cdn.v2ex.com/avatar/f997/c101/625465_large.png?m=1728551691"
      }, 
      "url": "https://www.v2ex.com/t/1156142", 
      "title": "\u8bf7\u6559\u4e0b \u54ea\u6b3e vscode \u63d2\u4ef6\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb\u8df3\u8f6c urls \u5b9a\u4e49", 
      "id": "https://www.v2ex.com/t/1156142", 
      "date_published": "2025-09-01T00:50:35+00:00", 
      "content_html": "<pre><code class=\"language-python\">path('api/v1/projects/', include('projects.urls'))\n</code></pre>\n<p>\u4f8b\u5982\u4ee5\u4e0a\u4ee3\u7801\uff0c\u6309\u7740 command \u70b9\u51fb urls \u5c31\u53ef\u4ee5\u8df3\u8f6c\u5230 urls \u5b9a\u4e49\u7684\u5730\u65b9</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/programMrxu", 
        "name": "programMrxu", 
        "avatar": "https://cdn.v2ex.com/avatar/3681/f0ad/481564_large.png?m=1735196118"
      }, 
      "url": "https://www.v2ex.com/t/1153079", 
      "title": "Django \u4e00\u6587\u544a\u8bc9\u4f60 all \u61d2\u52a0\u8f7d\u7684\u673a\u5236", 
      "id": "https://www.v2ex.com/t/1153079", 
      "date_published": "2025-08-18T02:11:40+00:00", 
      "content_html": "<h1>Django \u61d2\u52a0\u8f7d\u5b9e\u73b0\u65b9\u6cd5</h1>\n<p>\u5728 Django \u4e2d\uff0c\u6211\u4eec\u90fd\u77e5\u9053\u5f53\u6211\u4eec all \u4e4b\u540e\u662f\u4e0d\u4f1a\u9a6c\u4e0a\u53bb\u67e5\u8be2\u6570\u636e\u7684\uff0c\u5f53\u6211\u4eec\u771f\u6b63\u4f7f\u7528\u7684\u65f6\u5019\uff0c\u624d\u4f1a\u53bb\u89e6\u53d1\u67e5\u8be2\u64cd\u4f5c\u3002</p>\n<h2>\u6a21\u578b\u7c7b</h2>\n<p>\u4e0b\u9762\u6211\u5c06\u5e26\u7740\u5927\u5bb6\u4ece\u6e90\u7801\u7684\u89d2\u5ea6\u4e00\u6b65\u4e00\u6b65\u89e3\u6790\u3002</p>\n<pre><code class=\"language-python\">from django.db import models\n\n\n# Create your models here.\nclass Demo1(models.Model):\n    name = models.CharField(max_length=100)\n    age = models.IntegerField()\n\n    def __str__(self):\n        return self.name\n</code></pre>\n<p>\u770b\u4e00\u4e0b\u8fd9\u51e0\u884c\u4ee3\u7801\u53d1\u751f\u4e86\u4ec0\u4e48</p>\n<p>\u4f7f\u7528\u662f\u7ee7\u627f\u4e86 models.Model \u3002\u53bb\u770b\u4e00\u4e0b models.Model \u505a\u4e86\u4ec0\u4e48</p>\n<pre><code class=\"language-python\"># models.Model\nclass Model(AltersData, metaclass=ModelBase):\n    pass\n</code></pre>\n<p>\u53ef\u4ee5\u770b\u5230\u628a ModelBase \u5f53\u6210\u4e86\u5143\u7c7b\uff0c\u90a3\u6211\u4eec\u5c31\u53bb\u518d\u770b\u4e00\u4e0b ModelBase</p>\n<pre><code class=\"language-python\">class ModelBase(type):\n    \"\"\"Metaclass for all models.\"\"\"\n\n    def __new__(cls, name, bases, attrs, **kwargs):\n        super_new = super().__new__\n\n        # Also ensure initialization is only performed for subclasses of Model\n        # (excluding Model class itself).\n        parents = [b for b in bases if isinstance(b, ModelBase)]\n        if not parents:\n            return super_new(cls, name, bases, attrs)\n\n        # Create the class.\n        module = attrs.pop(\"__module__\")\n        new_attrs = {\"__module__\": module}\n        classcell = attrs.pop(\"__classcell__\", None)\n        if classcell is not None:\n            new_attrs[\"__classcell__\"] = classcell\n        attr_meta = attrs.pop(\"Meta\", None)\n        # Pass all attrs without a (Django-specific) contribute_to_class()\n        # method to type.__new__() so that they're properly initialized\n        # (i.e. __set_name__()).\n        contributable_attrs = {}\n        for obj_name, obj in attrs.items():\n            if _has_contribute_to_class(obj):\n                contributable_attrs[obj_name] = obj\n            else:\n                new_attrs[obj_name] = obj\n        new_class = super_new(cls, name, bases, new_attrs, **kwargs)\n\n        abstract = getattr(attr_meta, \"abstract\", False)\n        meta = attr_meta or getattr(new_class, \"Meta\", None)\n        base_meta = getattr(new_class, \"_meta\", None)\n\n        app_label = None\n\n        # Look for an application configuration to attach the model to.\n        app_config = apps.get_containing_app_config(module)\n\n        if getattr(meta, \"app_label\", None) is None:\n            if app_config is None:\n                if not abstract:\n                    raise RuntimeError(\n                        \"Model class %s.%s doesn't declare an explicit \"\n                        \"app_label and isn't in an application in \"\n                        \"INSTALLED_APPS.\" % (module, name)\n                    )\n\n            else:\n                app_label = app_config.label\n\n        new_class.add_to_class(\"_meta\", Options(meta, app_label))\n        if not abstract:\n            new_class.add_to_class(\n                \"DoesNotExist\",\n                subclass_exception(\n                    \"DoesNotExist\",\n                    tuple(\n                        x.DoesNotExist\n                        for x in parents\n                        if hasattr(x, \"_meta\") and not x._meta.abstract\n                    )\n                    or (ObjectDoesNotExist,),\n                    module,\n                    attached_to=new_class,\n                ),\n            )\n            new_class.add_to_class(\n                \"MultipleObjectsReturned\",\n                subclass_exception(\n                    \"MultipleObjectsReturned\",\n                    tuple(\n                        x.MultipleObjectsReturned\n                        for x in parents\n                        if hasattr(x, \"_meta\") and not x._meta.abstract\n                    )\n                    or (MultipleObjectsReturned,),\n                    module,\n                    attached_to=new_class,\n                ),\n            )\n            if base_meta and not base_meta.abstract:\n                # Non-abstract child classes inherit some attributes from their\n                # non-abstract parent (unless an ABC comes before it in the\n                # method resolution order).\n                if not hasattr(meta, \"ordering\"):\n                    new_class._meta.ordering = base_meta.ordering\n                if not hasattr(meta, \"get_latest_by\"):\n                    new_class._meta.get_latest_by = base_meta.get_latest_by\n\n        is_proxy = new_class._meta.proxy\n\n        # If the model is a proxy, ensure that the base class\n        # hasn't been swapped out.\n        if is_proxy and base_meta and base_meta.swapped:\n            raise TypeError(\n                \"%s cannot proxy the swapped model '%s'.\" % (name, base_meta.swapped)\n            )\n\n        # Add remaining attributes (those with a contribute_to_class() method)\n        # to the class.\n        for obj_name, obj in contributable_attrs.items():\n            new_class.add_to_class(obj_name, obj)\n\n        # All the fields of any type declared on this model\n        new_fields = chain(\n            new_class._meta.local_fields,\n            new_class._meta.local_many_to_many,\n            new_class._meta.private_fields,\n        )\n        field_names = {f.name for f in new_fields}\n\n        # Basic setup for proxy models.\n        if is_proxy:\n            base = None\n            for parent in [kls for kls in parents if hasattr(kls, \"_meta\")]:\n                if parent._meta.abstract:\n                    if parent._meta.fields:\n                        raise TypeError(\n                            \"Abstract base class containing model fields not \"\n                            \"permitted for proxy model '%s'.\" % name\n                        )\n                    else:\n                        continue\n                if base is None:\n                    base = parent\n                elif parent._meta.concrete_model is not base._meta.concrete_model:\n                    raise TypeError(\n                        \"Proxy model '%s' has more than one non-abstract model base \"\n                        \"class.\" % name\n                    )\n            if base is None:\n                raise TypeError(\n                    \"Proxy model '%s' has no non-abstract model base class.\" % name\n                )\n            new_class._meta.setup_proxy(base)\n            new_class._meta.concrete_model = base._meta.concrete_model\n        else:\n            new_class._meta.concrete_model = new_class\n\n        # Collect the parent links for multi-table inheritance.\n        parent_links = {}\n        for base in reversed([new_class] + parents):\n            # Conceptually equivalent to `if base is Model`.\n            if not hasattr(base, \"_meta\"):\n                continue\n            # Skip concrete parent classes.\n            if base != new_class and not base._meta.abstract:\n                continue\n            # Locate OneToOneField instances.\n            for field in base._meta.local_fields:\n                if isinstance(field, OneToOneField) and field.remote_field.parent_link:\n                    related = resolve_relation(new_class, field.remote_field.model)\n                    parent_links[make_model_tuple(related)] = field\n\n        # Track fields inherited from base models.\n        inherited_attributes = set()\n        # Do the appropriate setup for any model parents.\n        for base in new_class.mro():\n            if base not in parents or not hasattr(base, \"_meta\"):\n                # Things without _meta aren't functional models, so they're\n                # uninteresting parents.\n                inherited_attributes.update(base.__dict__)\n                continue\n\n            parent_fields = base._meta.local_fields + base._meta.local_many_to_many\n            if not base._meta.abstract:\n                # Check for clashes between locally declared fields and those\n                # on the base classes.\n                for field in parent_fields:\n                    if field.name in field_names:\n                        raise FieldError(\n                            \"Local field %r in class %r clashes with field of \"\n                            \"the same name from base class %r.\"\n                            % (\n                                field.name,\n                                name,\n                                base.__name__,\n                            )\n                        )\n                    else:\n                        inherited_attributes.add(field.name)\n\n                # Concrete classes...\n                base = base._meta.concrete_model\n                base_key = make_model_tuple(base)\n                if base_key in parent_links:\n                    field = parent_links[base_key]\n                elif not is_proxy:\n                    attr_name = \"%s_ptr\" % base._meta.model_name\n                    field = OneToOneField(\n                        base,\n                        on_delete=CASCADE,\n                        name=attr_name,\n                        auto_created=True,\n                        parent_link=True,\n                    )\n\n                    if attr_name in field_names:\n                        raise FieldError(\n                            \"Auto-generated field '%s' in class %r for \"\n                            \"parent_link to base class %r clashes with \"\n                            \"declared field of the same name.\"\n                            % (\n                                attr_name,\n                                name,\n                                base.__name__,\n                            )\n                        )\n\n                    # Only add the ptr field if it's not already present;\n                    # e.g. migrations will already have it specified\n                    if not hasattr(new_class, attr_name):\n                        new_class.add_to_class(attr_name, field)\n                else:\n                    field = None\n                new_class._meta.parents[base] = field\n            else:\n                base_parents = base._meta.parents.copy()\n\n                # Add fields from abstract base class if it wasn't overridden.\n                for field in parent_fields:\n                    if (\n                        field.name not in field_names\n                        and field.name not in new_class.__dict__\n                        and field.name not in inherited_attributes\n                    ):\n                        new_field = copy.deepcopy(field)\n                        new_class.add_to_class(field.name, new_field)\n                        # Replace parent links defined on this base by the new\n                        # field. It will be appropriately resolved if required.\n                        if field.one_to_one:\n                            for parent, parent_link in base_parents.items():\n                                if field == parent_link:\n                                    base_parents[parent] = new_field\n\n                # Pass any non-abstract parent classes onto child.\n                new_class._meta.parents.update(base_parents)\n\n            # Inherit private fields (like GenericForeignKey) from the parent\n            # class\n            for field in base._meta.private_fields:\n                if field.name in field_names:\n                    if not base._meta.abstract:\n                        raise FieldError(\n                            \"Local field %r in class %r clashes with field of \"\n                            \"the same name from base class %r.\"\n                            % (\n                                field.name,\n                                name,\n                                base.__name__,\n                            )\n                        )\n                else:\n                    field = copy.deepcopy(field)\n                    if not base._meta.abstract:\n                        field.mti_inherited = True\n                    new_class.add_to_class(field.name, field)\n\n        # Copy indexes so that index names are unique when models extend an\n        # abstract model.\n        new_class._meta.indexes = [\n            copy.deepcopy(idx) for idx in new_class._meta.indexes\n        ]\n\n        if abstract:\n            # Abstract base models can't be instantiated and don't appear in\n            # the list of models for an app. We do the final setup for them a\n            # little differently from normal models.\n            attr_meta.abstract = False\n            new_class.Meta = attr_meta\n            return new_class\n\n        new_class._prepare()\n        new_class._meta.apps.register_model(new_class._meta.app_label, new_class)\n        return new_class\n      \n    def _prepare(cls):\n        \"\"\"Create some methods once self._meta has been populated.\"\"\"\n        opts = cls._meta\n        opts._prepare(cls)\n\n        if opts.order_with_respect_to:\n            cls.get_next_in_order = partialmethod(\n                cls._get_next_or_previous_in_order, is_next=True\n            )\n            cls.get_previous_in_order = partialmethod(\n                cls._get_next_or_previous_in_order, is_next=False\n            )\n\n            # Defer creating accessors on the foreign class until it has been\n            # created and registered. If remote_field is None, we're ordering\n            # with respect to a GenericForeignKey and don't know what the\n            # foreign class is - we'll add those accessors later in\n            # contribute_to_class().\n            if opts.order_with_respect_to.remote_field:\n                wrt = opts.order_with_respect_to\n                remote = wrt.remote_field.model\n                lazy_related_operation(make_foreign_order_accessors, cls, remote)\n\n        # Give the class a docstring -- its definition.\n        if cls.__doc__ is None:\n            cls.__doc__ = \"%s(%s)\" % (\n                cls.__name__,\n                \", \".join(f.name for f in opts.fields),\n            )\n\n        get_absolute_url_override = settings.ABSOLUTE_URL_OVERRIDES.get(\n            opts.label_lower\n        )\n        if get_absolute_url_override:\n            setattr(cls, \"get_absolute_url\", get_absolute_url_override)\n\n        if not opts.managers:\n            if any(f.name == \"objects\" for f in opts.fields):\n                raise ValueError(\n                    \"Model %s must specify a custom Manager, because it has a \"\n                    \"field named 'objects'.\" % cls.__name__\n                )\n            manager = Manager()\n            manager.auto_created = True\n            cls.add_to_class(\"objects\", manager)\n\n        # Set the name of _meta.indexes. This can't be done in\n        # Options.contribute_to_class() because fields haven't been added to\n        # the model at that point.\n        for index in cls._meta.indexes:\n            if not index.name:\n                index.set_name_with_model(cls)\n\n        class_prepared.send(sender=cls)\n</code></pre>\n<p><a>\u53ef\u4ee5\u770b\u5230\u5728**_prepare**\u8fd9\u4e2a\u65b9\u6cd5\u91cc\u9762\u5224\u65ad\u4e86\u4e00\u4e0b\u6709\u6ca1\u6709 managers \u3002\u5982\u679c\u6ca1\u6709\u7684\u8bdd\u5c31\u4f1a\u53bb\u521b\u5efa\u4e00\u4e2a Manager \u7c7b\u3002\u5e76\u8bbe\u7f6e\u7ed9\u5f53\u524d\u5bf9\u8c61\u7684 objects \u7c7b\u3002\u6211\u4eec\u53bb\u770b\u4e00\u4e0b Managr \u7c7b</a></p>\n<pre><code class=\"language-python\">class Manager(BaseManager.from_queryset(QuerySet)):\n      def get_queryset(self):\n        \"\"\"\n        Return a new QuerySet object. Subclasses can override this method to\n        customize the behavior of the Manager.\n        \"\"\"\n        return self._queryset_class(model=self.model, using=self._db, hints=self._hints)\n\n    def all(self):\n        # We can't proxy this method through the `QuerySet` like we do for the\n        # rest of the `QuerySet` methods. This is because `QuerySet.all()`\n        # works by creating a \"copy\" of the current queryset and in making said\n        # copy, all the cached `prefetch_related` lookups are lost. See the\n        # implementation of `RelatedManager.get_queryset()` for a better\n        # understanding of how this comes into play.\n        return self.get_queryset()\n</code></pre>\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u91cc\u662f\u7ee7\u627f\u4e86 BaseManager.from_queryset(QuerySet)\u3002\u90a3\u7ee7\u7eed\u770b**BaseManager.from_queryset(QuerySet)**\u65b9\u6cd5</p>\n<pre><code class=\"language-python\">  class BaseManager:  \n  \t@classmethod\n    def from_queryset(cls, queryset_class, class_name=None):\n        if class_name is None:\n            class_name = \"%sFrom%s\" % (cls.__name__, queryset_class.__name__)\n        return type(\n            class_name,\n            (cls,),\n            {\n                \"_queryset_class\": queryset_class,\n                **cls._get_queryset_methods(queryset_class),\n            },\n        )\n</code></pre>\n<p>\u53ef\u4ee5\u770b\u5230\u662f\u4f7f\u7528 type \u521b\u5efa\u4e86\u7c7b\uff0c\u7136\u540e\u7ee7\u627f\u4e86\u5f53\u524d\u7c7b\uff0c\u6700\u540e\u5b9a\u4e49\u4e86\u4e00\u4e2a**_queryset_class**\u65b9\u6cd5\u3002\u5e76\u628a\u4f20\u5165\u7684 queryset_class(QuerySet)\u8bbe\u7f6e\u6210\u4e86_queryset_class \u5c5e\u6027\u7684\u503c\u3002<a></a></p>\n<pre><code class=\"language-python\">class QuerySet(AltersData):\n    \"\"\"Represent a lazy database lookup for a set of objects.\"\"\"\n\n    def __init__(self, model=None, query=None, using=None, hints=None):\n        self.model = model\n        self._db = using\n        self._hints = hints or {}\n        self._query = query or sql.Query(self.model)\n        self._result_cache = None\n        self._sticky_filter = False\n        self._for_write = False\n        self._prefetch_related_lookups = ()\n        self._prefetch_done = False\n        self._known_related_objects = {}  # {rel_field: {pk: rel_obj}}\n        self._iterable_class = ModelIterable\n        self._fields = None\n        self._defer_next_filter = False\n        self._deferred_filter = None\n        \n      def __iter__(self):\n        \"\"\"\n        The queryset iterator protocol uses three nested iterators in the\n        default case:\n            1. sql.compiler.execute_sql()\n               - Returns 100 rows at time (constants.GET_ITERATOR_CHUNK_SIZE)\n                 using cursor.fetchmany(). This part is responsible for\n                 doing some column masking, and returning the rows in chunks.\n            2. sql.compiler.results_iter()\n               - Returns one row at time. At this point the rows are still just\n                 tuples. In some cases the return values are converted to\n                 Python values at this location.\n            3. self.iterator()\n               - Responsible for turning the rows into model objects.\n        \"\"\"\n        self._fetch_all()\n        return iter(self._result_cache)\n      \n      \n    def _fetch_all(self):\n        if self._result_cache is None:\n            self._result_cache = list(self._iterable_class(self))\n        if self._prefetch_related_lookups and not self._prefetch_done:\n            self._prefetch_related_objects()\n</code></pre>\n<h2>\u5f00\u59cb\u67e5\u8be2</h2>\n<pre><code class=\"language-python\">Demo1.objects.all()\n[test_model for test_model in demos]\n</code></pre>\n<p>\u770b\u4e00\u4e0b\u8fd9\u51e0\u884c\u4ee3\u7801\u53d1\u751f\u4e86\u4ec0\u4e48\u3002</p>\n<p>DemoModes.objects \u8fd4\u56de\u7684\u5c31\u662f\u4e0a\u9762\u7684<a href=\"#managerClass\" rel=\"nofollow\">Manager</a>\u3002\u7136\u540e\u8c03\u7528\u4e86 Manager \u7684<strong>all</strong>\u3002\u7136\u540e\u5728 all \u91cc\u9762\u8fd4\u56de\u4e86\u4e86<a href=\"#querysetClass\" rel=\"nofollow\">_queryset_class</a>\u3002\u7531\u4e0a\u9762\u6211\u4eec\u53ef\u4ee5\u77e5\u9053 queryset_class \u662f\u4f20\u5165\u7684 QuerySet \u3002</p>\n<p>\u67e5\u8be2\u751f\u547d\u5468\u671f</p>\n<pre><code class=\"language-mermaid\">flowchart TD\nmodel[Demo] --&gt; objects[objects] -- Manager --&gt; all --&gt; get_queryset[\u8fd4\u56de\u4e86 QuerySet]\n</code></pre>\n<p>\u8fd9\u91cc\u73b0\u5728\u8fd4\u56de\u4e86 QuerySet \uff0c\u4f46\u662f\u5b9e\u9645\u4e0a\u6ca1\u6709\u548c\u6570\u636e\u5e93\u4ea4\u4e92\u5462\u3002\u771f\u6b63\u548c\u6570\u636e\u5e93\u4ea4\u4e92\u662f\u5728**[test_model for test_model in demos]**\u8fd9\u91cc\u3002</p>\n<p>\u5f53\u5f00\u59cb\u904d\u5386 demos \u7684\u65f6\u5019\u4f1a\u89e6\u53d1__iter__\u65b9\u6cd5\uff0c\u7136\u540e\u5728\u8fd9\u4e2a\u9b54\u6cd5\u51fd\u6570\u91cc\u9762\u4f1a\u89e6\u53d1**__fetch_all  [\u548c\u6570\u636e\u4ea4\u4e92] **\u65b9\u6cd5\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a\u4e00\u4e2a\u8fed\u4ee3\u5bf9\u8c61</p>\n<p>\u67e5\u8be2\u751f\u547d\u5468\u671f</p>\n<pre><code class=\"language-mermaid\">flowchart TD\nfor[\u5faa\u73af] --&gt; iter[_\\_iter\\_\\_] --&gt; _fetch_all --\u6570\u636e\u5e93\u4ea4\u4e92--&gt; \u8fd4\u56de\u7ed3\u679c\n</code></pre>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/walterggg", 
        "name": "walterggg", 
        "avatar": "https://cdn.v2ex.com/gravatar/e61dc18a51fbba4a7df9012755f38318?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1139305", 
      "date_modified": "2025-06-17T16:45:04+00:00", 
      "content_html": "", 
      "date_published": "2025-06-17T16:44:33+00:00", 
      "title": "\u5927\u5bb6\u5b66\u4e60\u7f16\u7a0b\u505a\u9879\u76ee\u7684\u65f6\u5019\u4e00\u5f00\u59cb\u4f1a\u5bb9\u6613\u5361\u58f3\u5417\uff1f\u6bd4\u5982\u6211\u4eca\u5929\u4e00\u4e2a\u4e0b\u5348\u624d\u5f04\u51fa\u6765\u4e86\u535a\u5ba2\u5f53\u4e2d\u7684\u6587\u7ae0\u8bc4\u8bba\u52a0\u56de\u590d\u529f\u80fd,\u6709\u65f6\u5019\u4f1a\u56e0\u4e3a\u4e00\u4e2a\u5c0f\u70b9\u5361\u58f3,\u7a0d\u5fae\u590d\u6742\u70b9\u7684\u903b\u8f91\u5c31\u611f\u89c9\u8111\u5b50\u4e0d\u591f\u7528,\u751a\u81f3\u662f\u7ed9 html \u7684 div \u53d6\u53d8\u91cf\u540d\u7684\u65f6\u5019\u8111\u5b50\u4e5f\u4f1a\u4e0d\u591f", 
      "id": "https://www.v2ex.com/t/1139305"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/hwhtj", 
        "name": "hwhtj", 
        "avatar": "https://cdn.v2ex.com/avatar/c7a8/558c/100031_large.png?m=1770429207"
      }, 
      "url": "https://www.v2ex.com/t/1059406", 
      "title": "\u8bf7\u6559\u5728 ubuntu23 \u4e2d\u5982\u4f55 \u8ba9 Django runserver \u5f00\u673a\u81ea\u542f\u52a8", 
      "id": "https://www.v2ex.com/t/1059406", 
      "date_published": "2024-07-23T04:46:15+00:00", 
      "content_html": "<p>\u53ea\u6709\u4e00\u4e2a\u9700\u6c42\uff0c\u5728 ubuntu23 \u5f00\u673a\u540e\u81ea\u52a8\u8fd0\u884c\u4ee5\u4e0b\u811a\u672c</p>\n<pre><code>/usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 --noreload\n</code></pre>\n<p>\u4ee5\u4e0a\u811a\u672c\uff0c\u76f4\u63a5\u5728\u7ec8\u7aef\u662f\u53ef\u4ee5\u8fd0\u884c\u7684\uff0c\u670d\u52a1\u4e5f\u8d77\u6765\u4e86\u3002\n\u4f46\u8981\u5f00\u673a\u8fd0\u884c\uff0c\u8bd5\u8fc7\u4e86\u4ee5\u4e0b\u4e09\u79cd\u65b9\u6cd5\uff0c\u90fd\u4e0d\u884c\n1 \u3001<a href=\"https://blog.csdn.net/yuezhilangniao/article/details/113772277\" rel=\"nofollow\">https://blog.csdn.net/yuezhilangniao/article/details/113772277</a>\n2 \u3001<a href=\"https://www.cnblogs.com/jingzaixin/p/15920472.html\" rel=\"nofollow\">https://www.cnblogs.com/jingzaixin/p/15920472.html</a>\n\u51fa\u73b0\u7684\u9519\u8bef\u662f</p>\n<pre><code>rc-local.service - /etc/rc.local Compatibility\n    Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; preset: enabled)\n   Drop-In: /usr/lib/systemd/system/rc-local.service.d\n            \u2514\u2500debian.conf\n    Active: failed (Result: exit-code) since Tue 2024-07-23 09:22:23 CST; 15min ago\n  Duration: 236ms\n   Process: 3617 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)\n  Main PID: 3621 (code=exited, status=1/FAILURE)\n       CPU: 344ms\n\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: Starting rc-local.service - /etc/rc.local Compatibility...\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: Started rc-local.service - /etc/rc.local Compatibility.\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: rc-local.service: Main process exited, code=exited, status=1/FAILURE\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: rc-local.service: Failed with result 'exit-code'.\n</code></pre>\n<p>3 \u3001\u4f7f\u7528 supervisor,\u51fa\u73b0\u7684\u9519\u8bef\u662f\uff1a</p>\n<pre><code>ImportError: Couldn&amp;#x27;t import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?\n......\n</code></pre>\n<p>\u6c42\u52a9\uff0c\u8bf7\u6559\uff0c\u5728 ubuntu23 \u4e2d\u5982\u4f55\u5f00\u673a\u65f6\u81ea\u52a8\u8fd0\u884c\u4e0a\u9762\u63d0\u5230\u7684\u811a\u672c</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/hwhtj", 
        "name": "hwhtj", 
        "avatar": "https://cdn.v2ex.com/avatar/c7a8/558c/100031_large.png?m=1770429207"
      }, 
      "url": "https://www.v2ex.com/t/1059319", 
      "date_modified": "2024-07-23T01:39:35+00:00", 
      "content_html": "<p>/etc/systemd/system/rc-local.service \u6587\u4ef6\u5185\u5bb9\uff1a</p>\n<pre><code class=\"language-[Unit]\"> Description=/etc/rc.local Compatibility\n ConditionPathExists=/etc/rc.local\n\n[Service]\n Type=forking\n ExecStart=/etc/rc.local start\n TimeoutSec=0\n StandardOutput=tty\n RemainAfterExit=yes\n SysVStartPriority=99\n\n[Install]\n WantedBy=multi-user.target\n</code></pre>\n<p>/etc/rc.local \u6587\u4ef6\u5185\u5bb9</p>\n<pre><code>#!/bin/sh -e\n#\n# rc.local\n#\n# This script is executed at the end of each multiuser runlevel.\n# Make sure that the script will \"exit 0\" on success or any other\n# value on error.\n#\n# In order to enable or disable this script just change the execution\n# bits.\n#\n# By default this script does nothing.\necho \"\u770b\u5230\u8fd9\u884c\u5b57\uff0c\u8bf4\u660e\u6dfb\u52a0\u81ea\u542f\u52a8\u811a\u672c\u6210\u529f\u3002\" &gt; /home/some/Qexo/test.log\na=`lsof -i:8000 | wc -l`\nif [ \"$a\" -eq \"0\" ];then\n       echo \"start nohup django:8000\" &gt;&gt; /home/some/Qexo/test.log\n             nohup  /usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 &gt; cmdb.log 2&gt;&amp;1 &amp;\n       else\n       echo \"8000 \u7aef\u53e3\u88ab\u5360\u7528\" &gt;&gt; /home/some/Qexo/test.log\nfi\n#source/home/some/Qexo/\n#nohup /usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 &gt; cmdb.log 2&gt;&amp;1 &amp;\necho \"\u770b\u5230\u8fd9\u884c\u5b57\uff0c\u8bf4\u660e django.sh \u6267\u884c\u8fc7\u3002\" &gt;&gt; /home/some/Qexo/test.log\nexit 0\n</code></pre>\n<p>\u91cd\u542f\u540e\uff0csudo systemctl status rc-local,\u62a5\u5982\u4e0b\u9519\u8bef</p>\n<pre><code> rc-local.service - /etc/rc.local Compatibility\n    Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; preset: enabled)\n   Drop-In: /usr/lib/systemd/system/rc-local.service.d\n            \u2514\u2500debian.conf\n    Active: failed (Result: exit-code) since Tue 2024-07-23 09:22:23 CST; 15min ago\n  Duration: 236ms\n   Process: 3617 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)\n  Main PID: 3621 (code=exited, status=1/FAILURE)\n       CPU: 344ms\n\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: Starting rc-local.service - /etc/rc.local Compatibility...\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: Started rc-local.service - /etc/rc.local Compatibility.\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: rc-local.service: Main process exited, code=exited, status=1/FAILURE\n7 \u6708 23 09:22:23 some-Ubuntu23 systemd[1]: rc-local.service: Failed with result 'exit-code'.\n</code></pre>\n", 
      "date_published": "2024-07-23T01:39:05+00:00", 
      "title": "\u8bf7\u6559 Django runserver \u5f00\u673a\u81ea\u542f\u52a8\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/1059319"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/walterggg", 
        "name": "walterggg", 
        "avatar": "https://cdn.v2ex.com/gravatar/e61dc18a51fbba4a7df9012755f38318?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1048189", 
      "date_modified": "2024-06-10T01:01:07+00:00", 
      "content_html": "<p>\u6700\u8fd1\u5728\u8bbe\u8ba1\u4e00\u4e2a\u5728\u7ebf\u5546\u5e97\uff0c\u9996\u5148\u8bf4\u4e00\u4e0b\u9879\u76ee\u80cc\u666f\uff0c\u6211\u5728\u6dd8\u5b9d\u505a\u5948\u98de\u5408\u79df\u751f\u610f\u4e09\u5e74\uff0c\u6211\u4eec\u6dd8\u5b9d\u5e97\u7684\u4fe1\u8a89\u4e00\u76f4\u5f88\u597d\uff0c\u7b2c\u4e00\u5e74\u7684\u65f6\u5019\uff0c\u5356\u7684\u5e74\u4ed8\u8f66\u4f4d\u4ef7\u683c\u5f88\u4f4e\uff0c\u4f46\u662f\u540e\u534a\u5e74\u6240\u5f00\u901a\u5730\u533a\u7684\u5948\u98de\u4f1a\u5458\u4ef7\u683c\u72c2\u98d9\uff0c\u6211\u6ca1\u6709\u8dd1\u8def\u4e5f\u4e0d\u6562\u8dd1\u8def\uff0c\u5168\u90e8\u8d26\u53f7\u90fd\u8865\u9f50\u4e86\u65f6\u95f4\uff0c\u8865\u4e86\u4e00\u4e07\u591a\u5757\u3002\u63a5\u4e0b\u6765\u7684\u4e24\u5e74\uff0c\u4e5f\u53d1\u751f\u4e86\u540c\u6837\u7684\u60c5\u51b5\uff0c\u4e00\u76f4\u575a\u6301\u5230\u4e86\u73b0\u5728\u2026\u2026</p>\n<p>\u5b9e\u9645\u4e0a\u4e24\u5e74\u524d\u6dd8\u5b9d\u5c31\u5f7b\u5e95\u4e0d\u8ba9\u5356\u5948\u98de\u4e86\uff0c\u53ea\u6709\u8001\u5ba2\u6237\u627e\u6211\u4e70\uff0c\u6211\u8fd9\u4e24\u5e74\u4ec0\u4e48\u4e8b\u4e5f\u6ca1\u5e72\uff0c\u611f\u89c9\u4eba\u751f\u597d\u5931\u8d25\u3002</p>\n<p>\u524d\u6bb5\u65f6\u95f4\u53d1\u73b0\u51e0\u4e2a\u505a\u7684\u4e0d\u9519\u7684\u6d41\u5a92\u4f53\u5408\u79df\u7f51\u7ad9\uff0c\u6240\u4ee5\u81ea\u5df1\u4e00\u65f6\u8d77\u5174\u9009\u62e9\u5f00\u53d1\u81ea\u5df1\u7684\u5728\u7ebf\u5546\u5e97\u3002</p>\n<p>\u6211\u4e00\u8fb9\u5b66\u4e60\u4e00\u8fb9\u5f00\u53d1\uff0c\u6700\u8fd1\u5b8c\u6210\u4e86\u7528\u6237\u6ce8\u518c\u767b\u5f55\u3001\u8ba2\u5355\u5904\u7406\u3001\u652f\u4ed8\u5b9d\u96c6\u6210\u3001\u81ea\u52a8\u53d1\u8d27\u3001\u5e2e\u52a9\u6587\u6863\u3001\u63a8\u5e7f\u7b97\u6cd5\u3001\u5fae\u4fe1\u7b49\u5e38\u7528\u804a\u5929\u65b9\u5f0f\u7684\u5ba2\u670d\u63a5\u5165\uff0c\u6211\u5927\u5b66\u73af\u5883\u8bbe\u8ba1\u4e13\u4e1a\uff0c\u5728\u5927\u5b66\u505a\u8bbe\u8ba1\u65b9\u6848\u7684\u65f6\u5019\u5c31\u5f88\u4e0d\u559c\u6b22\u5957\u7528\u4e00\u4e9b\u666e\u904d\u7684\u3001\u6ca1\u6709\u521b\u65b0\u6027\u7684\u6a21\u7248\uff0c\u6211\u559c\u6b22\u81ea\u5df1\u6298\u817e\u548c\u8ba4\u771f\u5b66\u4e60\u4f18\u79c0\u7684\u89e3\u51b3\u65b9\u6848\u3002\u56e0\u6b64\u5f00\u53d1\u7f51\u7ad9\u6ca1\u6709\u9009\u62e9\u5f00\u6e90\u7684\u5728\u7ebf\u5546\u5e97\u6a21\u7248\uff0c\u6240\u6709\u6a21\u578b\u90fd\u662f\u81ea\u5df1\u8bbe\u8ba1\uff0c\u524d\u540e\u7aef\u4e00\u8d77\u505a\u3002</p>\n<p>\u6700\u8fd1\u603b\u662f\u5728\u6000\u7591\u81ea\u5df1\uff0c\u505a\u8fd9\u4ef6\u4e8b\u662f\u5426\u6709\u610f\u4e49\uff1f\u56e0\u4e3a\u6d41\u5a92\u4f53\u7684\u98ce\u63a7\uff0c\u5408\u79df\u7684\u4f53\u9a8c\u5176\u5b9e\u5728\u964d\u4f4e\uff0c\u5927\u4f17\u4e5f\u666e\u904d\u4e86\u89e3\u7f51\u98de\u5e94\u8be5\u5982\u4f55\u8ba2\u9605\u2026\u2026 \u6211\u4e0d\u61c2\u6211\u7684\u76ee\u6807\u662f\u4ec0\u4e48\uff0c\u6211\u7684\u4e1a\u52a1\u662f\u5426\u771f\u7684\u53ef\u4ee5\u4e3a\u7528\u6237\u5e26\u6765\u4fbf\u5229\uff1f\u662f\u5426\u771f\u7684\u53ef\u4ee5\u89e3\u51b3\u5f53\u4e0b\u7684\u4e00\u4e9b\u95ee\u9898\uff1f\u5176\u6b21\u2026\u53ef\u4ee5\u89e3\u51b3\u6211\u7684\u4e00\u65e5\u4e09\u9910\u5417\u2026\u6bd5\u7adf\u6211\u5df2\u7ecf 26 \u4e86\uff0c\u4e5f\u9760\u4e0d\u8d77\u7236\u6bcd\u3002\u5982\u679c\u6211\u628a\u8fd9\u4e2a\u9879\u76ee\u5f53\u505a\u4e00\u4e2a\u5174\u8da3\u7684\u8bdd\uff0c\u597d\u50cf\u5bf9\u6211\u6765\u8bf4\u6709\u4e9b\u6536\u83b7\uff0c\u6211\u4f53\u9a8c\u5230\u4e86\u8fd9\u79cd\u5d2d\u65b0\u7684\u5b66\u4e60\u5bf9\u8c61\u7ed9\u6211\u5e26\u6765\u7684\u6210\u5c31\u611f\uff0c\u597d\u50cf\u5728\u5b66\u4e60\u4e0a\u53ef\u4ee5\u638c\u63e1\u7684\u4e1c\u897f\u53d8\u591a\u4e86\uff0c\u6bd4\u4e0d\u5b66\u4e60\u7684\u65f6\u5019\u5fc3\u91cc\u53d1\u89c9\u8e0f\u5b9e\u4e86\u5f88\u591a\u3002\u6211\u4ece\u6bd5\u4e1a\u5230\u73b0\u5728\u56db\u5e74\u4e86\uff0c\u8fd9\u56db\u5e74\u57fa\u672c\u6ca1\u6709\u5b66\u4e60\u8ddf\u4efb\u4f55\u804c\u4e1a\u5173\u8054\u7684\u4e1c\u897f\uff0c\u9664\u4e86\u6d41\u5a92\u4f53\u5408\u79df\u65b9\u9762\u3002</p>\n<p>\u6211\u5728\u8bbe\u8ba1\u7f51\u7ad9\u7684\u65f6\u5019\u9047\u5230\u4e86\u5f88\u591a\u95ee\u9898\uff0c\u6280\u672f\u4e0a\u7684\u5c31\u4e0d\u8bf4\u4e86\uff0c\u56e0\u4e3a\u6211\u4e0d\u662f\u6280\u672f\u4e13\u5bb6\uff0c\u6211\u66f4\u4e13\u6ce8\u4e8e\u8bbe\u8ba1\u95ee\u9898\u7684\u89e3\u51b3\u65b9\u6848\u3002</p>\n<p>\u6211\u5f88\u60f3\u8bbe\u8ba1\u4e00\u4e2a\u5b8c\u7f8e\u7684\u7528\u6237\u8868\u5355\u586b\u5199\u548c\u9a8c\u8bc1\u7684\u65b9\u6848\uff0c\u540c\u65f6\u786e\u4fdd\u524d\u540e\u7aef\u901a\u4fe1\u7684\u5b89\u5168\u3002\u6bd4\u5982\u5927\u5bb6\u90fd\u4e0d\u559c\u6b22\u6ce8\u518c\u8d26\u53f7\u3001\u4e0d\u613f\u610f\u63d0\u4ea4\u624b\u673a\u53f7\u7801\u8fd9\u4e9b\u6765\u4f5c\u4e3a\u8eab\u4efd\u9a8c\u8bc1\uff0c\u8fd9\u662f\u6211\u5728\u5f00\u53d1\u7f51\u7ad9\u4e2d\u79ef\u6781\u89e3\u51b3\u7684\u4e8b\u60c5\u3002</p>\n<p>\u6211\u5728\u7528\u6237\u8ba2\u5355\u677f\u5757\u8981\u6c42\u7528\u6237\u586b\u5199\u90ae\u7bb1\u5730\u5740\uff0c\u7528\u6237\u63d0\u4ea4\u8ba2\u5355\u5230\u540e\u7aef\u7684\u652f\u4ed8\u8bf7\u6c42\u51fd\u6570\u4e2d\uff0c\u6211\u52a0\u5165\u4e86\u5bf9\u4e8e\u7528\u6237 email \u72b6\u6001\u7684\u68c0\u6d4b\u8fdb\u884c\u91cd\u5b9a\u5411\uff0c\u6216\u8005\u7ee7\u7eed\u5904\u7406\u8868\u5355\u7684\u903b\u8f91\uff0c\u5982\u679c\u7528\u6237\u8f93\u5165\u7684 email \u4e0d\u5728\u6570\u636e\u5e93\u5185\u5c31\u4f1a\u8df3\u8f6c\u5230\u6ce8\u518c\u9875\u9762\uff0c\u53cd\u4e4b\u4f1a\u8df3\u8f6c\u5230\u767b\u9646\u9875\u9762\uff0c\u5e76\u4e14\u81ea\u52a8\u586b\u5199 email \u4fe1\u606f\uff0c\u7528\u6237\u53ea\u9700\u8981\u8f93\u5165\u4e00\u4e2a\u5bc6\u7801\u5373\u53ef\uff0c\u6ce8\u518c\u548c\u767b\u5f55\u754c\u9762\u90fd\u8bbe\u8ba1\u4e86\u4e00\u4e2a\u590d\u9009\u6846\uff0c\u5982\u679c\u7528\u6237\u540c\u610f\uff0c\u90a3\u4e48\u8868\u5355\u4f1a\u5728\u6ce8\u518c/\u767b\u5f55\u6210\u529f\u4e4b\u540e\u7ee7\u7eed\u53d1\u8d77\u652f\u4ed8\u8bf7\u6c42\uff08\u4ec5\u9650\u4e8e\u8ba2\u5355\u5361\u7247\u677f\u5757\u53d1\u8d77\u7684\u8bf7\u6c42\uff09\uff0c\u8fd9\u6837\u53ef\u4ee5\u63d0\u9ad8\u8f6c\u5316\u7387\u548c\u51cf\u5c11\u7528\u6237\u91cd\u65b0\u8f93\u5165\u3002\u5982\u679c\u5728\u70b9\u5f00\u8ba2\u5355\u5361\u7247\u4e4b\u524d\u5df2\u7ecf\u767b\u5f55\uff0c\u90a3\u4e48\u6211\u4eec\u7684\u8ba2\u5355\u8868\u683c\u5c31\u4f1a\u81ea\u52a8\u8f93\u5165\u7528\u6237\u767b\u5f55\u7684 email \u3002\u7c7b\u4f3c\u7684\u5904\u7406\u673a\u5236\u8fd0\u7528\u5230\u6211\u4eec\u7f51\u7ad9\u7684\u5404\u4e2a\u677f\u5757\u3002</p>\n<p>\u6211\u8fd8\u4e13\u6ce8\u4e8e\u7f51\u7ad9\u4fe1\u606f\u7684\u4e0a\u4e0b\u67b6\u89e3\u51b3\u65b9\u6848\uff0c\u6bd4\u5982\u5e2e\u52a9\u4e2d\u5fc3\u7684\u6587\u6863\uff0c\u4e3a\u6b64\u6211\u9009\u62e9\u7684\u662f\u4e3a\u5176\u521b\u5efa\u4e00\u4e2a\u535a\u5ba2\u6a21\u578b\uff0c\u5728\u540e\u53f0\u5c31\u53ef\u4ee5\u521b\u5efa\u6216\u66f4\u65b0\u73b0\u6709\u7684\u5e2e\u52a9\u4e2d\u5fc3\u6587\u6863\u2026\u4e0d\u7528\u6253\u5f00\u4ee3\u7801\u7f16\u8f91\u5668\u6dfb\u52a0\u91cd\u590d\u7684\u64cd\u4f5c\u2026\u2026</p>\n<p>\u6700\u540e\u662f\u5173\u4e8e\u7f51\u7ad9\u7684\u5b89\u5168\u9632\u536b\u63aa\u65bd\uff0c\u6211\u5bf9\u6240\u6709\u7528\u6237\u8f93\u5165\u7684\u4fe1\u606f\u90fd\u8fdb\u884c\u4e86\u53cc\u91cd\u8ba4\u8bc1\uff0c\u4e0d\u76f8\u4fe1\u7528\u6237\u8f93\u5165\u7684\u4efb\u4f55\u4fe1\u606f\uff0c\u4e3b\u8981\u9632\u6b62\u4e00\u4e9b\u9488\u5bf9\u7f51\u7ad9\u7684\u6076\u610f\u653b\u51fb\uff0c\u56e0\u4e3a\u7f51\u7ad9\u7684\u524d\u7aef\u90fd\u662f\u900f\u660e\u7684\uff0c\u8fd9\u70b9\u8ba9\u4eba\u5f88\u4e0d\u5b89\u3002</p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u6211\u7684\u4e00\u4e9b\u5fc3\u8def\u5386\u7a0b\uff0c\u548c\u5bf9\u7f51\u7ad9\u5f00\u53d1\u7684\u601d\u8003\u2026\u2026\n\u9879\u76ee\u6f14\u793a\u89c6\u9891\uff1a <a href=\"https://youtube.com/shorts/8gza4B-1Upo?si=xaIFFFNsHt6yxd29\" rel=\"nofollow\">https://youtube.com/shorts/8gza4B-1Upo?si=xaIFFFNsHt6yxd29</a></p>\n", 
      "date_published": "2024-06-10T00:53:32+00:00", 
      "title": "\u4e0d\u77e5\u9053\u5f00\u53d1\u7684\u6d41\u5a92\u4f53\u5408\u79df\u5e73\u53f0\u6709\u6ca1\u6709\u610f\u4e49\u2026", 
      "id": "https://www.v2ex.com/t/1048189"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Brand001", 
        "name": "Brand001", 
        "avatar": "https://cdn.v2ex.com/avatar/4750/26af/669784_large.png?m=1709200187"
      }, 
      "url": "https://www.v2ex.com/t/1029583", 
      "title": "\u516c\u53f8\u81ea\u4e3b\u62db\u8058\uff08\u8fdc\u7a0b\uff09\u540e\u7aef Go \u5f00\u53d1\uff0c\u60f3\u8981\u8fdc\u7a0b\u5c97\u4f4d\u6293\u7d27\u5566", 
      "id": "https://www.v2ex.com/t/1029583", 
      "date_published": "2024-04-03T13:49:19+00:00", 
      "content_html": "\u540e\u7aef Go \u8fdc\u7a0b\u5c97\u4f4d\u804c\u8d23:<br />\u7b80\u5386\u6295\u9012 email\uff1a zygs2151@gmail.com<br />1 \u3001\u8d1f\u8d23\u6838\u5fc3\u6280\u672f\u95ee\u9898\u7684\u653b\u5173\u3001\u67b6\u6784\u8bbe\u8ba1\u3001\u7cfb\u7edf\u4f18\u5316\uff0c\u534f\u52a9\u89e3\u51b3\u9879\u76ee\u5f00\u53d1\u8fc7\u7a0b\u4e2d \u7684\u6280\u672f\u96be\u9898;<br />2 \u3001\u9ad8\u6027\u80fd\u670d\u52a1\u5668\u7aef\u7a0b\u5e8f\u7684\u8bbe\u8ba1\u3001\u5f00\u53d1\u548c\u6d4b\u8bd5;<br />3 \u3001\u8d1f\u8d23\u73b0\u6709\u4e1a\u52a1\u7684\u5fae\u670d\u52a1\u5316\uff0c\u5e76\u5728\u4e0d\u65ad\u7684\u5b66\u4e60\u5f53\u4e2d\u80fd\u591f\u5f62\u6210\u81ea\u5df1\u7684\u67b6\u6784\u65b9\u6cd5\u8bba;<br />4 \u3001Go/Golang/C++/C \u5f00\u53d1\u540e\u53f0\u76f8\u5173\u9879\u76ee\u7ecf\u9a8c\u3002<br />\u5c97\u4f4d\u8981\u6c42:<br />1 \u3001\u4e13\u79d1\u53ca\u4ee5\u4e0a\u5b66\u5386\uff0c3 \u5e74\u4ee5\u4e0a go \u540e\u7aef\u5f00\u53d1\u7ecf\u9a8c\uff0c\u81f3\u5c11\u6709 \u4e00\u4e2a\u5b8c\u6574\u9879\u76ee\u7684\u5f00<br />\u53d1\u7ecf\u9a8c;<br />2 \u3001\u624e\u5b9e\u7684 Golang \u57fa\u7840\uff0c\u61c2\u5f97\u4ee3\u7801\u8c03\u4f18\u53ca\u6027\u80fd\u4f18\u5316\u65b9\u6cd5;<br />3 \u3001\u719f\u6089 goroutine \u3001channel \u3001mutex \u3001syncmap \uff0c\u719f\u6089\u7f51\u7edc\u7f16\u7a0b;<br />4 \u3001\u719f\u6089 restful \u63a5\u53e3\u5f00\u53d1\uff0c\u5e76\u6709\u76f8\u5173\u7ecf\u9a8c;<br />5 \u3001\u719f\u6089\u540e\u53f0\u5bf9\u5916\u5f00\u653e\u5e73\u53f0\u63a5\u53e3\u89c4\u5212\uff0c\u5e76\u6709\u76f8\u5173\u7ecf\u9a8c\u719f\u6089\u4e00\u79cd\u5173\u7cfb\u578b\u6570\u636e\u5e93\uff0c\u5982 MySQL \u3001Sql<br />Server \uff0c\u719f\u6089 SQL \u8bed\u53e5;<br />6 \u3001\u719f\u6089\u5e38\u7528 NoSQL \u6570\u636e\u5e93\uff0cMongoDB \u3001Redis \u7b49;<br />7 \u3001\u719f\u6089 bash \u811a\u672c\u7f16\u7a0b\uff0c\u719f\u6089\u5e38\u7528\u7684 Linux \u7cfb\u7edf\u7b49\u5b9e\u7528\u5de5\u5177;<br />8 \u3001\u4fdd\u6301\u6280\u672f\u70ed\u60c5\uff0c\u6709\u5f3a\u70c8\u7684\u8d23\u4efb\u5fc3\u548c\u56e2\u961f\u7cbe\u795e\uff0c\u5584\u4e8e\u6c9f\u901a\u548c\u5408\u4f5c\u3002<br />\u5e95\u85aa\u8303\u56f4\uff1a20~50K \u4eba\u6c11\u5e01\uff08\u5177\u4f53\u9762\u8bae\uff09<br />\u6c42\u804c\u54a8\u8be2\ud83d\udc49<br />email\uff1a zygs2151@gmail.com<br />#golang<br />\u5de5\u4f5c\u65b9\u5f0f\u53ca\u8bed\u8a00\uff1a<br />\u5168\u804c\u8fdc\u7a0b\u5de5\u4f5c \u8fdc\u7a0b\u5de5\u4f5c\u65f6\u95f4\uff1a\u5317\u4eac\u65f6\u95f4 10\uff1a00 - 20\uff1a00 \uff0c\u56fa\u5b9a\u5468\u672b\u53cc\u4f11\uff0c\u5348\u4f11+\u665a\u9910\u4f11 \u56fd\u5185\u8282\u5047\u65e5\u7edf\u4e00\u6b63\u5e38\u4f11\u5047<br />\u5de5\u4f5c\u8bed\u8a00\uff1a\u5168\u4e2d\u6587<br />\u5f55\u7528\u6d41\u7a0b\uff1a \u89c6\u9891\u9762\u8bd5\uff1a2-3 \u8f6e\uff0c1-2 \u5929\u5185\u53cd\u9988<br />\u90ae\u7bb1\uff1a zygs2151@gmail.com<br />wechat ID : shenyanlin2212<br />\u5176\u4ed6\u8fdc\u7a0b\u5c97\u4f4d\u5305\u62ec\uff1aUI/UX \uff0cWeb \u524d\u7aef\uff0cCocos \u5f00\u53d1\uff0c\u6e38\u620f\u7cfb\u7edf\u7b56\u5212\u7b49"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/vikland", 
        "name": "vikland", 
        "avatar": "https://cdn.v2ex.com/gravatar/75ecfb9cd343022d824b6a1e5fe6f4d0?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1028732", 
      "title": "[\u6c42\u52a9] Mediacms \u63a5\u5165 Keycloak", 
      "id": "https://www.v2ex.com/t/1028732", 
      "date_published": "2024-04-01T03:21:27+00:00", 
      "content_html": "<p>\u5728\u4ee3\u7801\u4e2d\u5347\u7ea7\u4e86 django-allauth==0.61.0<br/>\n\u7136\u540e INSTALLED_APPS \u6dfb\u52a0\u4e86\"allauth.socialaccount.providers.openid_connect\"<br/>\nsites \u914d\u7f6e\u4e0d\u592a\u6e05\u695a\u505a\u4ec0\u4e48\u7684</p>\n<hr/>\n<p>\u95ee\u9898\uff1a\u73b0\u5728\u4e00\u70b9\u51fb\u767b\u5f55\u5c31 500error..<br/>\n\u4e0d\u77e5\u9053\u6709\u6ca1\u6709\u8001\u54e5\u613f\u610f\u4ed8\u8d39\u5e2e\u5fd9\u770b\u4e00\u4e0b\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/yuan321", 
        "name": "yuan321", 
        "avatar": "https://cdn.v2ex.com/avatar/b56a/010a/575413_large.png?m=1762327479"
      }, 
      "url": "https://www.v2ex.com/t/1017521", 
      "date_modified": "2024-02-22T06:20:51+00:00", 
      "content_html": "<p>\u6700\u597d\u662f\u6700\u8fd1\u51e0\u5e74\u7684\u9879\u76ee\uff1f</p>\n", 
      "date_published": "2024-02-22T06:15:26+00:00", 
      "title": "\u6709\u6ca1\u6709\u597d\u7684 drf \u9879\u76ee\u53ef\u4ee5\u5b66\u4e60\u4e0b\u7684\uff1f", 
      "id": "https://www.v2ex.com/t/1017521"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/yuan321", 
        "name": "yuan321", 
        "avatar": "https://cdn.v2ex.com/avatar/b56a/010a/575413_large.png?m=1762327479"
      }, 
      "url": "https://www.v2ex.com/t/1015223", 
      "date_modified": "2024-02-10T10:42:51+00:00", 
      "content_html": "", 
      "date_published": "2024-02-10T03:43:41+00:00", 
      "title": "django \u5feb\u901f\u5f00\u53d1\u660e\u660e drf \u66f4\u597d\uff0c\u4e3a\u5565\u8fd8\u662f\u5f88\u591a\u4eba\u66f4\u63a8\u8350 fast.api \u548c\u5fcd\u8005", 
      "id": "https://www.v2ex.com/t/1015223"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/yuan321", 
        "name": "yuan321", 
        "avatar": "https://cdn.v2ex.com/avatar/b56a/010a/575413_large.png?m=1762327479"
      }, 
      "url": "https://www.v2ex.com/t/1013560", 
      "date_modified": "2024-02-02T01:25:05+00:00", 
      "content_html": "<p>\u6709\u90a3\u4e48\u591a\u9ad8\u6027\u80fd\u7684 web \u6846\u67b6\uff0c\u4e3a\u5565\u8fd8\u662f\u6709\u4e0d\u5c11\u4eba\u9009\u62e9 django</p>\n", 
      "date_published": "2024-02-02T00:44:32+00:00", 
      "title": "django \u7684\u540c\u6b65\u673a\u5236\u6709\u6027\u80fd\u74f6\u9888\u4e3a\u4ec0\u4e48\u8fd8\u662f\u6709\u5f88\u591a\u4eba\u7528\uff1f", 
      "id": "https://www.v2ex.com/t/1013560"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Licsber", 
        "name": "Licsber", 
        "avatar": "https://cdn.v2ex.com/avatar/5831/7907/241046_large.png?m=1763562575"
      }, 
      "url": "https://www.v2ex.com/t/1012264", 
      "title": "\u5927\u5bb6\u600e\u4e48\u5904\u7406\u5f00\u53d1\u65f6 Migration \u4e00\u5927\u5806\uff0c\u4fee\u4fee\u6539\u6539\u5570\u5570\u55e6\u55e6\uff0c\u540c\u6b65\u5230\u751f\u4ea7\u4e4b\u524d\u8fd8\u5f97\u68c0\u67e5\u5408\u5e76\u4e0b\u8fd9\u4e2a\u95ee\u9898\u7684\uff1f", 
      "id": "https://www.v2ex.com/t/1012264", 
      "date_published": "2024-01-28T15:29:29+00:00", 
      "content_html": "<p>\u5f00\u53d1\u7684\u65f6\u5019\u603b\u4f1a\u4fee\u4fee\u6539\u6539</p>\n<p>\u7136\u540e\u5c31\u770b\u5230 migrate \u6587\u4ef6\u4e00\u76f4\u53e0\u52a0\u751f\u6210</p>\n<p>\u95ee\u9898\u662f\u5f00\u53d1\u7684\u65f6\u5019 DB \u7ed3\u6784\u53ef\u80fd\u88ab\u6211\u6539\u6765\u6539\u53bb \u8fc7\u4e00\u4f1a\u751a\u81f3\u8fd8\u4f1a\u6709\u56de\u9000\u7684 migrate \u6587\u4ef6\uff08</p>\n<p>\u7136\u540e\u5f3a\u8feb\u75c7\u5c31\u5f88\u4e0d\u723d \u6211\u4f1a\u5728\u786e\u8ba4\u4fee\u6539\u540e\u628a\u672c\u5730\u6570\u636e\u5e93\u6574\u4e2a\u6e05\u6389 \u7136\u540e git reset \u6389\u6240\u6709\u5f00\u53d1\u671f\u95f4\u7684 migrate \u6587\u4ef6</p>\n<p>\u518d\u91cd\u65b0\u751f\u6210\u4e00\u904d migrate \u518d\u540c\u6b65\u5230\u751f\u4ea7\u5e93\u53bb</p>\n<p>\u8fd9\u662f\u6b63\u5e38\u5f00\u53d1\u6d41\u7a0b\u5417 \u600e\u4e48\u611f\u89c9\u4e00\u70b9\u90fd\u4e0d\u4f18\u96c5</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/coolair", 
        "name": "coolair", 
        "avatar": "https://cdn.v2ex.com/avatar/c4fe/52ac/36118_large.png?m=1691894552"
      }, 
      "url": "https://www.v2ex.com/t/1005876", 
      "date_modified": "2024-01-06T14:31:30+00:00", 
      "content_html": "<pre><code>class CustomManager(models.Manager):\n    def filter(self, *args, **kwargs):\n        conditions = ...\n        return super().get_queryset().filter(conditions).filter(*args, **kwargs)\n</code></pre>\n<p>\u8fd9\u6837\u4f7f\u7528 <code>Custom.objects.filter(key=value)</code> \u662f\u6ca1\u6709\u95ee\u9898\u7684\uff0c\u4f46\u662f <code>Custom.objects.filter(key=value).filter(key2=value2)</code> \u8fd9\u6837\u5c31\u4e0d\u884c\u4e86\uff0c\u56e0\u4e3a\u8fd9\u4e2a <code>filter</code> \u53ea\u4f5c\u7528\u5728 manager \u4e0a\uff0c\u800c\u6ca1\u6709\u4f5c\u7528\u5728 queryset \u4e0a\uff0c\u5e94\u8be5\u5982\u4f55\u5904\u7406\u554a\uff1f</p>\n", 
      "date_published": "2024-01-04T08:53:31+00:00", 
      "title": "Django \u6a21\u578b\u81ea\u5b9a\u4e49 Manager \u81ea\u5b9a\u4e49 filter \u5982\u4f55\u652f\u6301\u94fe\u5f0f\u8c03\u7528\uff1f", 
      "id": "https://www.v2ex.com/t/1005876"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/jiayouzl", 
        "name": "jiayouzl", 
        "avatar": "https://cdn.v2ex.com/avatar/5587/d5a7/282500_large.png?m=1761660727"
      }, 
      "url": "https://www.v2ex.com/t/1000896", 
      "title": "python3 manage.py build_index \u8fd9\u6761 Django \u547d\u4ee4\u5230\u5e95\u5565\u610f\u601d\u554a?\u5b98\u65b9\u6587\u6863\u627e\u4e0d\u5230\u8bf4\u660e,\u8c22\u8c22", 
      "id": "https://www.v2ex.com/t/1000896", 
      "date_published": "2023-12-16T05:02:57+00:00", 
      "content_html": "<p>\u770b\u522b\u4eba\u9879\u76ee\u90e8\u7f72\u542f\u52a8\u6709\u8fd9\u6761\u547d\u4ee4,\u4f46\u5b98\u7f51\u67e5\u4e0d\u5230\u8d44\u6599,\u8c22\u8c22\u5927\u5bb6.</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/boxy123", 
        "name": "boxy123", 
        "avatar": "https://cdn.v2ex.com/gravatar/6b71953e43ef480fd027e08e87369d98?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/1000479", 
      "title": "\u524d\u540e\u7aef\u5206\u79bb\u9879\u76ee\uff0c Django \u826f\u597d\u7684\u9879\u76ee\u7ed3\u6784\u662f\u600e\u4e48\u6837\u7684", 
      "id": "https://www.v2ex.com/t/1000479", 
      "date_published": "2023-12-14T12:50:19+00:00", 
      "content_html": ""
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/programMrxu", 
        "name": "programMrxu", 
        "avatar": "https://cdn.v2ex.com/avatar/3681/f0ad/481564_large.png?m=1735196118"
      }, 
      "url": "https://www.v2ex.com/t/989121", 
      "title": "Django get_max_test_processes", 
      "id": "https://www.v2ex.com/t/989121", 
      "date_published": "2023-11-06T07:05:56+00:00", 
      "content_html": "<p>def get_max_test_processes():\n\"\"\"\nThe maximum number of test processes when using the --parallel option.\n\"\"\"\n# The current implementation of the parallel test runner requires\n# multiprocessing to start subprocesses with fork() or spawn().\nif multiprocessing.get_start_method() not in {\"fork\", \"spawn\"}:\nreturn 1\ntry:\nreturn int(os.environ[\"DJANGO_TEST_PROCESSES\"])\nexcept KeyError:\nreturn multiprocessing.cpu_count()</p>\n<p>\u8fd9\u91cc\u4e3a\u4ec0\u4e48\u4e0d\u662f fork \u6216\u8005\u4e0d\u662f spawn \uff0c\u5c31\u4f1a\u8fd4\u56de 1 \u5462\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/coolair", 
        "name": "coolair", 
        "avatar": "https://cdn.v2ex.com/avatar/c4fe/52ac/36118_large.png?m=1691894552"
      }, 
      "url": "https://www.v2ex.com/t/988935", 
      "date_modified": "2023-11-06T01:53:29+00:00", 
      "content_html": "\u81ea\u5df1\u521b\u5efa\u7684 app \u9ed8\u8ba4\u5c31\u5728 app \u76ee\u5f55\u4e0b\u7684 migrations \u6587\u4ef6\u5939\u4e2d\uff0c\u5982\u679c\u662f\u4f7f\u7528 pip \u5b89\u88c5\u7684\u5305\uff0c\u5bf9\u5305\u91cc\u9762\u7684 models \u8fdb\u884c\u4e86\u53d8\u66f4\uff0c\u5bf9\u5e94\u7684 migrations \u5c31\u653e\u5728 venv \u4e0b\u5305\u7684\u76ee\u5f55\u91cc\u4e86\u3002<br /><br />\u6709\u6ca1\u6709\u529e\u6cd5\u5c06\u8fd9\u4e9b migrations \u6587\u4ef6\u653e\u5728\u4fee\u6539\u4ed6\u4ee3\u7801\u7684\u5f53\u524d\u76ee\u5f55\u4e0b\u7684 migrations \u91cc\uff0c\u4fdd\u8bc1 venv \u73af\u5883\u4e0d\u4f1a\u53d8\u66f4\uff1f", 
      "date_published": "2023-11-06T01:27:38+00:00", 
      "title": "Django makemigrations \u751f\u6210\u7684 migrations \u6587\u4ef6\uff0c\u5982\u4f55\u653e\u5728\u4ee3\u7801\u5f53\u524d\u76ee\u5f55\u7684\u6587\u4ef6\u5939\u4e2d\uff1f", 
      "id": "https://www.v2ex.com/t/988935"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/jiayouzl", 
        "name": "jiayouzl", 
        "avatar": "https://cdn.v2ex.com/avatar/5587/d5a7/282500_large.png?m=1761660727"
      }, 
      "url": "https://www.v2ex.com/t/984457", 
      "title": "\u8bf7\u6559\u4e0b\u5927\u5bb6,Django \u7684 tests \u6d4b\u8bd5\u6a21\u5757,\u5982\u4f55\u4e0d\u521b\u5efa\u65b0\u4ece\u6d4b\u8bd5\u6570\u636e\u5e93,\u800c\u662f\u76f4\u63a5\u64cd\u4f5c\u751f\u4ea7\u73af\u5883\u6570\u636e\u5e93\u8c22\u8c22!", 
      "id": "https://www.v2ex.com/t/984457", 
      "date_published": "2023-10-23T04:14:24+00:00", 
      "content_html": "<p>\u4e00\u4e2a\u4e0d\u5927\u4e0d\u5c0f\u7684 bug \u60f3\u8981\u8c03\u8bd5,\u591a\u8868\u8054\u5408\u7684\u8c03\u8bd5,\u65b0\u521b\u5efa\u6570\u636e\u5e93\u597d\u9ebb\u70e6,\u5982\u4f55\u76f4\u63a5\u4f7f\u7528\u751f\u4ea7\u73af\u5883\u76f4\u63a5\u6d4b\u8bd5?\u8981\u5982\u4f55\u8bbe\u7f6e?\u8c22\u8c22</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/fantathat", 
        "name": "fantathat", 
        "avatar": "https://cdn.v2ex.com/avatar/ae84/c9b1/592864_large.png?m=1725006407"
      }, 
      "url": "https://www.v2ex.com/t/981924", 
      "date_modified": "2023-10-15T00:27:36+00:00", 
      "content_html": "<p>\u81ea\u5e26 admin \u5728 ios \u4e0a\u65e0\u6cd5\u767b\u5f55\uff0cdjango \u7248\u672c\u548c ios \u7248\u672c\u4e0d\u662f\u5f88\u6e05\u695a\uff0c\u8fd9\u6b63\u5e38\u5417</p>\n<p>\u4ec0\u4e48\u65f6\u5019\u7684\u4e8b\uff1f</p>\n<p>\u8bf4\u5230\u767b\u5f55\u4e86\uff0c\u5f53\u7136\u662f\u7528 https, form \u8868\u5355 post \uff0c\u81ea\u5e26\u7684\u3002</p>\n", 
      "date_published": "2023-10-14T03:28:46+00:00", 
      "title": "django \u597d\u50cf\u5bf9\u4e8e ios \u6253\u4e0d\u5f00 admin page", 
      "id": "https://www.v2ex.com/t/981924"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/elboble", 
        "name": "elboble", 
        "avatar": "https://cdn.v2ex.com/gravatar/3427d21885aca1e4e2149b2fdcf1b799?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/973144", 
      "date_modified": "2023-09-12T13:11:43+00:00", 
      "content_html": "Django \u7528\u6a21\u677f\uff0c\u9047\u5230\u8fd9\u4e48\u4e2a\u9700\u6c42\uff0c\u6298\u817e\u4e86\u597d\u4e45\u3002<br /><br />\u540e\u7aef\u8fd4\u56de\u7684\u662f\u5f62\u5982<br />{a_1:1,a_2:2,a_3:3.....}\u8fd9\u6837\u7684\u5bf9\u8c61\u3002\u6211\u8981\u5728\u6a21\u677f\u4e2d\u5c55\u793a\u8fd9\u4e9b{{ a_1 }},{{ a_2 }}...<br /><br />\u81ea\u7136\u800c\u7136\u60f3\u7528\u5faa\u73af\uff0c\u5176\u5b9e\u662f\u4e2a\u5d4c\u5957 {{ a_{{forloop_counter}} }}\uff0c\u4f46\u662f\u6a21\u677f\u4e0d\u652f\u6301\u3002<br /><br />\u548c gpt \u78cb\u5546\u534a\u5929\uff0c\u8fd9\u6837\u66f2\u7ebf\u5b9e\u73b0\u4e86<br /><br />1.\u540e\u7aef\u8fd4\u56de\u52a0\u4e00\u5c42\u58f3\uff1a<br />{data:{a_1:1,a_2:2,a_3:3.....}}<br /><br />2.\u4f60\u53ef\u4ee5\u4f7f\u7528 with \u6807\u7b7e\u521b\u5efa\u4e00\u4e2a\u4e2d\u95f4\u53d8\u91cf \uff0c\u5e76\u5728\u5185\u90e8\u6784\u5efa\u5d4c\u5957\u7684\u53d8\u91cf\u540d\u6765\u8bbf\u95ee\u5bf9\u5e94\u7684\u503c\uff1a<br />{% for num in \"123\" %}<br />  {% with var_name=\"total_\"|add:num %}<br />    {{ var_name }}: {{ data|getvar:var_name }}<br />  {% endwith %}<br />{% endfor %}<br /><br />3.\u81ea\u5b9a\u4e49\u4e00\u4e2a\u8fc7\u6ee4\u5668<br />@<a target=\"_blank\" href=\"/member/register\" rel=\"nofollow noopener\">register</a>.filter<br />def getvar(dictionary, key):<br />    return dictionary.get(key, '')<br />    <br />\u6709\u6ca1\u6709\u66f4 decent \u7684\u65b9\u6cd5\uff0c\u96be\u602a\u90fd\u53bb\u7528 vue \u4e86\u3002", 
      "date_published": "2023-09-12T13:11:14+00:00", 
      "title": "Django \u6a21\u677f\u4e2d\u53d8\u91cf\u7684\u5d4c\u5957", 
      "id": "https://www.v2ex.com/t/973144"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Hopetree", 
        "name": "Hopetree", 
        "avatar": "https://cdn.v2ex.com/avatar/38cb/fd52/265542_large.png?m=1714960392"
      }, 
      "url": "https://www.v2ex.com/t/955069", 
      "title": "\u65e9\u8d77\u628a\u7f51\u7ad9\u7684\u53cb\u94fe\u7f51\u9875\u548c\u81ea\u4e3b\u6dfb\u52a0\u53cb\u94fe\u529f\u80fd\u64b8\u51fa\u6765\u4e86\uff0c\u8fc7\u6765\u6536\u96c6\u4e00\u6ce2\u53cb\u94fe", 
      "id": "https://www.v2ex.com/t/955069", 
      "date_published": "2023-07-08T03:56:20+00:00", 
      "content_html": "<p><a href=\"https://tendcode.com/friend/\" rel=\"nofollow\" title=\" Django \u81ea\u5efa\u535a\u5ba2\u7f51\u7ad9\"> Django \u81ea\u5efa\u535a\u5ba2\u7f51\u7ad9 https://tendcode.com</a></p>\n<p>\u65e9\u8d77\u628a\u7f51\u7ad9\u7684\u53cb\u94fe\u7f51\u9875\u548c\u81ea\u4e3b\u6dfb\u52a0\u53cb\u94fe\u529f\u80fd\u64b8\u51fa\u6765\u4e86\uff0c\u8fc7\u6765\u6536\u96c6\u4e00\u6ce2\u53cb\u94fe</p>\n<p>\u5b9e\u73b0\u529f\u80fd\uff1a</p>\n<ul>\n<li>\u53cb\u94fe\u663e\u793a\u9875\u9762\uff0c\u53cb\u94fe\u63d0\u4ea4\u9875\u9762</li>\n<li>\u7f51\u7ad9 celery \u5b9a\u65f6\u4efb\u52a1\u81ea\u52a8\u68c0\u6d4b\u53cb\u94fe\uff0c\u4e3b\u8981\u662f\u5c06\u65e0\u6cd5\u8bbf\u95ee\u7684\u53cb\u94fe\u6807\u8bb0\u51fa\u6765\u4e0d\u505a\u8df3\u8f6c\uff0c\u540c\u65f6\u5c06\u6062\u590d\u8bbf\u95ee\u7684\u53cb\u94fe\u6062\u590d\u663e\u793a</li>\n<li>\u81ea\u4e3b\u63d0\u4ea4\u53cb\u94fe\u540e\u7ed9\u7ba1\u7406\u5458\u53d1\u9001\u7cfb\u7edf\u6d88\u606f\uff0c\u7ba1\u7406\u5458\u53ef\u4ee5\u53ca\u65f6\u5ba1\u6838\uff0c\u5ba1\u6838\u901a\u8fc7\u7684\u76f4\u63a5\u663e\u793a\u5230\u53cb\u94fe\u9875\u9762</li>\n</ul>\n<p>\u53cb\u8054\u9875\u9762\u6548\u679c\uff1a</p>\n<p><a href=\"https://tendcode.com/friend/\" rel=\"nofollow\"><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://github.com/Hopetree/izone/assets/30201215/15bd7706-a831-4856-b19a-10b67f5e2dcb\"/></a></p>\n<p>\u7cfb\u7edf\u63a8\u9001\u4fe1\u606f\uff1a</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://github.com/Hopetree/izone/assets/30201215/526689c4-9591-47af-8753-5b0d1c650d8e\"/></p>\n<p>\u5b9a\u65f6\u4efb\u52a1\u68c0\u67e5\u81ea\u52a8\u66f4\u65b0\u53cb\u94fe\u72b6\u6001</p>\n<p><img alt=\"\" class=\"embedded_image\" loading=\"lazy\" referrerpolicy=\"no-referrer\" rel=\"noreferrer\" src=\"https://github.com/Hopetree/izone/assets/30201215/478a7145-9471-417f-9548-6cd59ab30fcc\"/></p>\n<p>\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u4ea4\u6362\u4e00\u6ce2\u53cb\u60c5\u94fe\u63a5</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/mylifcc", 
        "name": "mylifcc", 
        "avatar": "https://cdn.v2ex.com/gravatar/319d7380bd385a6a3fc671a51d6b6bd0?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/938676", 
      "title": "\u7528 django \u8c03\u7528\u957f\u65f6\u95f4\u6267\u884c\u7684\u811a\u672c\uff0c\u5982\u4f55\u8fd4\u8fd8\u8f93\u51fa\u5462\uff1f", 
      "id": "https://www.v2ex.com/t/938676", 
      "date_published": "2023-05-09T10:13:11+00:00", 
      "content_html": "<p>\u6211\u60f3\u7528 django \u505a\u4e00\u4e2a\u63a5\u53e3\uff0c\u63a5\u5230 start \u8bf7\u6c42\u540e\uff0c\u5c31\u6267\u884c\u4e00\u4e2a python \u811a\u672c\uff0c\u540c\u65f6\u53ef\u4ee5\u5c06\u8f93\u51fa\u6216\u65e5\u5fd7\u8fd4\u8fd8\u7ed9\u524d\u7aef\uff0c\u63a5\u5230 stop \u8bf7\u6c42\u5c31 kill \u811a\u672c\uff0c\u8fd9\u6837\u5982\u4f55\u5199\u6bd4\u8f83\u5408\u7406\u5462\uff1f\n\u7528 celery \u5199\u4e86\u4e00\u4e0b\uff0c\u4f46\u662f\u65e0\u6cd5\u7ed3\u675f\u8fdb\u7a0b\uff0c\u4e0d\u77e5\u9053\u539f\u56e0\uff0c\u4e5f\u641e\u4e0d\u5b9a\u65e5\u5fd7\u3002\u3002\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/qsnow6", 
        "name": "qsnow6", 
        "avatar": "https://cdn.v2ex.com/avatar/f5fb/13d1/180875_large.png?m=1752161475"
      }, 
      "url": "https://www.v2ex.com/t/937905", 
      "date_modified": "2023-05-06T09:00:47+00:00", 
      "content_html": "<p>\u4f8b\u5982\u6709\u4e00\u4e2a\u9012\u5f52\u7684\u5206\u7c7b model \uff0c\u6dfb\u52a0\u5230 admin \u540e\uff0c\u9ed8\u8ba4\u7684\u7ec4\u4ef6\u662f\u5e73\u94fa\u663e\u793a\u6240\u6709\u5206\u7c7b\u7684\uff0c\u7528\u4ec0\u4e48\u7ec4\u4ef6\u663e\u793a\u8fd9\u7c7b\u5bf9\u8c61\u6bd4\u8f83\u5408\u9002\uff1f</p>\n<pre><code class=\"language-python\">from django.db import models\n\nclass Category(models.Model):\n    name = models.CharField(max_length=50)\n    parent = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True, related_name='children')\n\n    def __str__(self):\n        return self.name\n</code></pre>\n", 
      "date_published": "2023-05-06T08:59:13+00:00", 
      "title": "Django \u4e2d\u9012\u5f52\u5206\u7c7b model \u7528\u4ec0\u4e48\u7ec4\u4ef6\u663e\u793a\u6bd4\u8f83\u5408\u9002\uff1f", 
      "id": "https://www.v2ex.com/t/937905"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zzm88104", 
        "name": "zzm88104", 
        "avatar": "https://cdn.v2ex.com/gravatar/d4ae14c4e5d0330778d7f1f08c7707b2?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/912455", 
      "title": "django \u4e00\u5f00\u59cb\u6ca1\u7528 restfulapi \u5f00\u53d1, \u8fd8\u80fd\u81ea\u52a8\u751f\u6210\u6587\u6863\u5417?", 
      "id": "https://www.v2ex.com/t/912455", 
      "date_published": "2023-02-02T01:37:04+00:00", 
      "content_html": "\u4e00\u5f00\u59cb\u662f\u60f3\u505a\u4e2a\u7b80\u5355\u7684\u5c0f\u63d2\u4ef6, \u4f46\u540e\u6765\u529f\u80fd\u8d8a\u52a0\u8d8a\u591a. <br /><br />\u9700\u8981\u8ddf\u524d\u7aef\u5408\u4f5c, \u9700\u8981\u544a\u77e5\u4ed6\u65b0 api \u7684\u4f7f\u7528\u65b9\u5f0f. \u73b0\u5728\u662f\u4e22\u7ed9\u4ed6\u4fdd\u5b58\u4e86 example \u7684 postman \u8ba9\u4ed6\u81ea\u5df1\u770b. \u8fd9\u79cd\u65b9\u5f0f\u5bf9\u524d\u7aef\u53cb\u597d\u5417?<br /><br />\u6587\u6863\u80af\u5b9a\u662f\u6700\u597d, \u4f46\u4e00\u6761\u4e00\u6761 api \u5199\u6587\u6863\u611f\u89c9\u6bd4\u8f83\u4f4e\u6548, \u53ea\u662f\u7528\u7231\u53d1\u7535\u7684\u5c0f\u9879\u76ee,\u4e5f\u82b1\u4e0d\u8d77\u592a\u591a\u65f6\u95f4.<br /><br />\u4e0d\u77e5\u9053\u6709\u6ca1\u6709\u4e8b\u540e\u8865\u6551\u7684\u529e\u6cd5?"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zzm88104", 
        "name": "zzm88104", 
        "avatar": "https://cdn.v2ex.com/gravatar/d4ae14c4e5d0330778d7f1f08c7707b2?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/910832", 
      "title": "\u6c42\u63a8 django \u6570\u636e\u53ef\u89c6\u5316\u63d2\u4ef6", 
      "id": "https://www.v2ex.com/t/910832", 
      "date_published": "2023-01-27T04:05:51+00:00", 
      "content_html": "\u6ca1\u4e86\u89e3\u8fc7\u76f8\u5173\u8bdd\u9898, \u60f3\u8981\u4e00\u4e2a\u5f00\u7bb1\u5373\u7528\u63d2\u4ef6, \u53ef\u4ee5\u76f4\u89c2\u770b\u5230\u6570\u636e\u53d8\u5316\u7684\u56fe\u8868(chart)<br /><br />\u5f88\u7b80\u5355\u7684\u6570\u636e, \u5c31\u662f\u8e29\u8d5e\u6570\u968f\u65f6\u95f4\u53d8\u5316\u7684\u8d8b\u52bf\u4e4b\u7c7b\u7684<br /><br />\u8c22\u8c22!"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/albert0yyyy", 
        "name": "albert0yyyy", 
        "avatar": "https://cdn.v2ex.com/gravatar/02c953716ffd48dab60c9d9c1960fe37?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/907438", 
      "title": "django \u7528 docker \u90e8\u7f72\uff0c\u8981\u4e0d\u8981\u6bcf\u6b21\u90e8\u7f72\u5230\u670d\u52a1\u5668\u7684\u65f6\u5019\u6539\u6539 image \u7684 settings \u914d\u7f6e", 
      "id": "https://www.v2ex.com/t/907438", 
      "date_published": "2023-01-08T14:21:29+00:00", 
      "content_html": "<p>\u6211\u5728\u5c1d\u8bd5 docker \u90e8\u7f72 django \uff0c\u521a\u521a\u63a5\u89e6\u5bb9\u5668\u5316\u90e8\u7f72\uff0c\u9047\u5230\u4e86\u4e00\u4e9b\u601d\u7ef4\u4e0d\u592a\u597d\u8f6c\u53d8\u7684\u95ee\u9898\u3002</p>\n<p>django \u7684\u6570\u636e\u5e93\u662f\u8981\u5728 docker build container \u7684\u65f6\u5019\uff0c\u5c31\u628a\u670d\u52a1\u5668\u7684\u6570\u636e\u5e93\u914d\u7f6e\u5199\u5230 <a href=\"http://settings.py\" rel=\"nofollow\">settings.py</a> \u91cc\u5417\uff0c\u90a3 build \u5b8c image \uff0c\u80af\u5b9a\u8981\u5728\u672c\u5730\u770b\u770b\u80fd\u4e0d\u6b63\u5e38\u542f\u52a8\u8fd9\u4e2a container \uff0c\u6ca1\u95ee\u9898\u624d\u53ef\u4ee5 push \u4e0a\u53bb\u5427\u3002\u90a3\u6211\u6bcf\u6b21\u6539 setting \u914d\u7f6e\uff0c\u5728 git \u7248\u672c\u63a7\u5236\u7684\u65f6\u5019\uff0c\u5176\u5b9e\u8fd9\u4e9b\u914d\u7f6e\u6539\u52a8\u4e0d\u7b97\u662f\u4e00\u79cd\u8fed\u4ee3\u66f4\u65b0\uff0c\u56e0\u4e3a\u4e00\u4e2a\u7a0b\u5e8f\u4f1a\u8fd0\u884c\u5728\u8bb8\u591a\u4e2a\u670d\u52a1\u5668\uff0c\u4f1a\u7528\u5230\u8bb8\u591a\u4e2a\u6570\u636e\u5e93\u3002</p>\n<p>\u9664\u975e\u6570\u636e\u5e93\u4e5f\u7528 docker \u542f\u52a8\uff0c\u5230\u65f6\u5019\u670d\u52a1\u5668\u542f\u52a8 django \u548c\u6570\u636e\u5e93\u4e24\u4e2a\u5bb9\u5668\u3002</p>\n<p>\u4f46\u662f\u6211\u542f\u52a8\u6570\u636e\u5e93\u5bb9\u5668\u7684\u64cd\u4f5c\u4e5f\u662f\u633a\u9ebb\u70e6\u7684\uff0c\u4e5f\u5f97\u6539\u6539\u6570\u636e\u5e93\u5bb9\u5668\u7684\u914d\u7f6e\u3002\u800c\u4e14\u6211\u770b\u5230 docker hub \u4e0a\u4e00\u4e9b\u5b98\u65b9\u955c\u50cf\uff0c\u6bd4\u5982 postgresql \u4e5f\u6709\u63d0\u5230\u542f\u52a8\u5b8c\u955c\u50cf\uff0c\u8fdb\u53bb\u521b\u5efa\u6570\u636e\u5e93\u8fd9\u79cd\u64cd\u4f5c\u3002</p>\n<p>\u7efc\u4e0a\uff0c\u6211\u89c9\u5f97\u8fd8\u4e0d\u5982\u672c\u5730\u8c03\u8bd5\u5b8c django container \uff0c\u670d\u52a1\u5668 pull \u4e0b\u6765\uff0c\u6539\u6539\u8fd9\u4e2a\u6570\u636e\u5e93\u548c\u5176\u4ed6\u7684\u4e00\u4e9b\u914d\u7f6e\u3002\u50cf\u6570\u636e\u5e93\u8fd9\u79cd\u7b97\u57fa\u7840\u8bbe\u65bd\uff0c\u5b89\u88c5\u5728\u5bbf\u4e3b\u673a\u4e0a\uff0c\u800c\u4e14\u8fd9\u79cd\u8f6f\u4ef6\u4e0d\u4f1a\u50cf\u6211\u4eec\u5199\u7684\u7a0b\u5e8f\u9047\u5230\u592a\u591a\u5b89\u88c5\u95ee\u9898\u3002</p>\n<hr/>\n<p>\u6574\u7406\u4e86\u4e00\u4e0b</p>\n<p>\u6570\u636e\u5e93\u5f00\u53d1\u73af\u5883\u548c\u670d\u52a1\u5668\u4e0d\u4e00\u81f4\uff0c\u6240\u4ee5\u5c31\u8981\u6709\u4e24\u79cd\u6570\u636e\u5e93\u914d\u7f6e\uff08\u5f00\u53d1 /\u751f\u4ea7\u73af\u5883\uff09</p>\n<ul>\n<li>\n<p>\u6784\u5efa\u597d\u7684\u955c\u50cf\u672c\u5730\u5e94\u8be5\u8c03\u8bd5\u597d\u4e86\uff08\u4e0d\u662f\u6307\u8c03\u8bd5\u4ee3\u7801\u8fd0\u884c\u7684\u95ee\u9898\uff0c\u662f\u6307\u8c03\u8bd5\u4ee3\u7801\u90e8\u7f72\u7684\u95ee\u9898\uff09\uff0c\u90a3\u5c31\u8981\u6c42\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\uff0c\u80fd\u7528\u4e0a\u670d\u52a1\u5668\u7684\u6570\u636e\u5e93\u914d\u7f6e\u3002</p>\n<ol>\n<li>\n<p>\u5f00\u53d1\u73af\u5883\u5b89\u88c5\u6570\u636e\u5e93\u8f6f\u4ef6\uff0c\u5e76\u521b\u5efa\u548c\u670d\u52a1\u5668\u7684\u6570\u636e\u5e93\u4e00\u6837\u7684\u914d\u7f6e</p>\n</li>\n<li>\n<p>\u6216\u8005\u6784\u5efa\u6570\u636e\u5e93\u955c\u50cf</p>\n</li>\n</ol>\n</li>\n</ul>\n<p>\u7a0b\u5e8f\u4f1a\u591a\u6b21\u90e8\u7f72\uff0c\u4f1a\u7528\u5230\u4e0d\u540c\u6570\u636e\u5e93\uff0c\u6bcf\u6b21\u6539\u52a8\u6570\u636e\u5e93\u914d\u7f6e\uff0c\u5728\u7248\u672c\u63a7\u5236\u4e0a\u6765\u8bb2\u4e0d\u7b97\u662f\u4e00\u6b21\u8fed\u4ee3\u66f4\u65b0\uff0c\u6240\u4ee5\u89c9\u5f97\u6784\u5efa\u955c\u50cf\u524d\u5148\u6539\u597d\u6570\u636e\u5e93\u914d\u7f6e\u4e0d\u5408\u7406</p>\n<p>\u6211\u6700\u7ec8\u7684\u60f3\u6cd5\u662f\uff0c\u751f\u4ea7\u73af\u5883\u7684\u914d\u7f6e\u5148\u628a key \u5199\u597d\u4e86\uff0cvalue \u4e0d\u5199\u3002\u672c\u5730\u6d4b\u8bd5\u90e8\u7f72\uff0c\u670d\u52a1\u5668\u90e8\u7f72\u7684\u65f6\u5019\uff0c\u8fdb\u5165\u955c\u50cf\u6539\u6539\u518d\u8fd0\u884c</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/szyp", 
        "name": "szyp", 
        "avatar": "https://cdn.v2ex.com/gravatar/c2ca33834d5a467b077a71c2ad3ee1e4?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/905382", 
      "date_modified": "2022-12-29T07:54:00+00:00", 
      "content_html": "<p>\u63d2\u4ef6\u5730\u5740 <a href=\"https://marketplace.visualstudio.com/items?itemName=xiangcai.django-gettext\" rel=\"nofollow\">django.po</a></p>\n<p>github <a href=\"https://github.com/runningzyp/django-gettext\" rel=\"nofollow\">django-gettext</a></p>\n<p>\u8fd9\u4e5f\u662f\u6211\u5199\u7684\u7b2c\u4e00\u4e2a vscode \u63d2\u4ef6\uff0c\u529f\u80fd\u975e\u5e38\u7b80\u5355\uff0c\u76ee\u524d\u53ea\u652f\u6301\u9ad8\u4eae\u8bed\u6cd5\u548c\u8df3\u8f6c\u94fe\u63a5</p>\n<p>\u501f\u9274\u4e86\u522b\u4eba\u7684 <a href=\"https://marketplace.visualstudio.com/items?itemName=mrorz.language-gettext\" rel=\"nofollow\">gettext</a> \u63d2\u4ef6( Django \u7684\u56fd\u9645\u5316\u6a21\u5757\u672c\u8d28\u4e0a\u8fd8\u662f\u8c03\u7528\u7684 GNU gettext ), \u4f46\u662f\u4e0d\u652f\u6301\u4e0d\u5e26\u884c\u53f7\u7684\u8df3\u8f6c\uff0c\u672c\u6765\u60f3\u63d0\u4e2a mr \u7684\uff0c\u4f46\u662f\u4eba\u5bb6\u7684\u63d2\u4ef6\u662f\u7ed9 gettext \u5199\u7684\u6bd4\u8f83\u901a\u7528\uff0c\u4e0d\u592a\u597d\u652f\u6301\u6211\u8fd9\u79cd\u5c0f\u4f17\u9700\u6c42\uff0c\u4e8e\u662f\u6211\u5c31\u6253\u7b97\u81ea\u5df1\u5c1d\u8bd5\u5199\u4e00\u4e2a</p>\n<p>\u7ed3\u679c\u7a0d\u5fae\u770b\u4e00\u4e0b <a href=\"https://code.visualstudio.com/api\" rel=\"nofollow\">vscode \u7684\u6587\u6863</a>\u53d1\u73b0\u5199\u4e00\u4e2a\u5c0f\u63d2\u4ef6\u8fd8\u662f\u6bd4\u8f83\u7b80\u5355\u7684</p>\n<p>\u6b22\u8fce\u5927\u5bb6\u5c1d\u8bd5\u4e00\u4e0b\uff0c\u540e\u7eed\u6211\u4e5f\u4f1a\u6162\u6162\u6539\u8fdb\u7684</p>\n<hr/>\n<p>\u8865\u5145\u63d0\u9192\u5927\u5bb6\u4e00\u4e0b django \u7684\u56fd\u9645\u5316\u53ef\u4ee5\u8c03\u7528 django-admin \u7684 </p>\n<pre><code class=\"language-python\">django-admin makemessages --add-location=file -a\n</code></pre>\n<p>\u547d\u4ee4</p>\n", 
      "date_published": "2022-12-29T07:51:24+00:00", 
      "title": "\u6709\u6ca1\u6709\u4f7f\u7528 django \u56fd\u9645\u5316\u6a21\u5757\u7684\uff0c\u9488\u5bf9 django.po \u56fd\u9645\u5316\u6587\u4ef6\u5199\u4e86\u4e00\u4e2a vscode \u7684\u63d2\u4ef6", 
      "id": "https://www.v2ex.com/t/905382"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/coolair", 
        "name": "coolair", 
        "avatar": "https://cdn.v2ex.com/avatar/c4fe/52ac/36118_large.png?m=1691894552"
      }, 
      "url": "https://www.v2ex.com/t/889905", 
      "date_modified": "2022-10-26T02:02:27+00:00", 
      "content_html": "\u6bd4\u5982\u6709 User \u548c Department<br />d1 = user.department<br />d2 = Department.objects.first()<br /><br />\u5982\u4f55\u77e5\u9053 d1 \u662f\u901a\u8fc7 user \u8bbf\u95ee\u7684\u5462\uff1f<br />\u6211\u60f3\u5982\u679c\u662f\u901a\u8fc7 user.department \u8bbf\u95ee\u7684\uff0c\u5c31\u7ed9\u8fd9\u4e2a department \u52a0\u4e0a\u4e00\u4e2a\u5c5e\u6027 department.from=user \uff0c\u600e\u4e48\u64cd\u4f5c\u597d\uff1f", 
      "date_published": "2022-10-26T01:59:43+00:00", 
      "title": "Django \u8bbf\u95ee relation \u65f6\uff0c\u5982\u4f55\u5f97\u77e5\u662f\u8c01\u8bbf\u95ee\u7684\uff1f", 
      "id": "https://www.v2ex.com/t/889905"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/piaochen0", 
        "name": "piaochen0", 
        "avatar": "https://cdn.v2ex.com/gravatar/312ea072d72f1c8624ced1fb1768aa8c?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/886127", 
      "date_modified": "2022-10-11T08:59:49+00:00", 
      "content_html": "\u9879\u76ee\u7528\u7684 django 2.1.5 \uff0c\u5df2\u7ecf\u7a33\u5b9a\u8fd0\u884c\u4e86\u4e24\u4e09\u5e74\u4e86\u3002\u540e\u53f0\u7ba1\u7406\u7528\u7684\u81ea\u5e26\u7684 admin \u3002  <br />  <br />\u4f46\u662f\u8fd9\u4e24\u5929\u4e00\u4e2a\u5076\u7136\u673a\u4f1a\u7a81\u7136\u53d1\u73b0\uff0c\u5728\u6211\u81ea\u5df1\u7535\u8111\u5f00\u53d1\u73af\u5883\u8c03\u8bd5\u6a21\u5f0f\u4e0b\uff0c\u8bbf\u95ee admin \u540e\u53f0\uff0c\u90e8\u5206 admin \u81ea\u5e26\u7684 css \u6587\u4ef6\u8bbf\u95ee\u8fd4\u56de 200 \uff0c\u4f46\u662f\u5927\u5c0f\u4e3a 0 \u3002  <br />\u6e05\u7a7a\u6d4f\u89c8\u5668\u7f13\u5b58\uff0c\u66f4\u6362\u6d4f\u89c8\u5668\u540e\u4ecd\u7136\u5982\u6b64\u3002  <br />  <br />\u5230\u751f\u4ea7\u670d\u52a1\u5668\u4e0a\u770b\uff0ccollectstatic \u5b8c\u6210\u540e\uff0cstatic/admin/css \u76ee\u5f55\u4e0b\uff0c\u6709\u51e0\u4e2a css \u6587\u4ef6\uff0c\u5927\u5c0f\u4e5f\u4e3a 0 \uff0c\u53ea\u6709\u4e24\u4e09\u4e2a\u6587\u4ef6\u5927\u5c0f\u6b63\u5e38\u3002 <br />  <br />\u5177\u4f53\u60c5\u51b5\u5982\u56fe\uff1a <br />![]( <a target=\"_blank\" href=\"https://files.catbox.moe/m9e5v2.png\" rel=\"nofollow noopener\">https://files.catbox.moe/m9e5v2.png</a>)<br />  <br />\u670d\u52a1\u5668\u4e0a static \u76ee\u5f55\u4e0b\u8fd9\u90e8\u5206\u5927\u5c0f\u4e3a 0 \u7684\u6587\u4ef6\uff0c\u5728\u6211\u81ea\u5df1\u5f00\u53d1\u73af\u5883\u7528\u6d4f\u89c8\u5668\u8bbf\u95ee\u5927\u5c0f\u4e3a 0 \uff0c\u5927\u5c0f\u975e 0 \u7684\u6587\u4ef6\u5728\u5f00\u53d1\u73af\u5883\u4e5f\u90fd\u80fd\u6b63\u5e38\u8bbf\u95ee\u3002  <br />\u67e5\u770b\u672c\u673a\u548c\u670d\u52a1\u7aef site-package \u4e2d\u7684 django \u76ee\u5f55\uff0c\u8fd9\u4e9b css \u6587\u4ef6\u90fd\u662f\u6709\u5185\u5bb9\u7684\u3002    <br />    <br />\u76ee\u524d\u53d1\u73b0 js \u76ee\u5f55\u6709\u4e00\u4e2a related-widget-wrapper.js \u6587\u4ef6\u5927\u5c0f\u4e3a 0 \uff08\u8fd9\u4e2a\u6587\u4ef6\u5728 lib \u4e2d django \u540c\u7ea7\u76ee\u5f55\u4e0b\u6ca1\u53d1\u73b0\uff09\uff0c\u5176\u4ed6\u6ca1\u53d1\u73b0\u5f02\u5e38\u3002     <br />django2.1.5 \u6211\u4eec\u8fd9\u8fb9\u51e0\u4e2a\u9879\u76ee\u5728\u7528\uff0c\u76ee\u524d\u53d1\u73b0\u6709\u7684\u9879\u76ee\u6709\u8fd9\u4e2a\u95ee\u9898\uff0c\u6709\u7684\u6b63\u5e38\u3002 \u5bf9\u6bd4\u4e86\u4e0b settings \u8bbe\u7f6e\uff0c\u4e5f\u6ca1\u53d1\u73b0\u4ec0\u4e48\u7279\u6b8a\u7684\u5730\u65b9\u3002admin \u770b\u4e0a\u6837\u5f0f\u4e5f\u90fd\u6b63\u5e38\u3002  <br />  <br />\u8fd9\u4e2a\u662f\u600e\u4e48\u56de\u4e8b\uff1f\u6709\u4ec0\u4e48\u89e3\u51b3\u601d\u8def\u5417\uff1f   <br />\u9ebb\u70e6\u5404\u4f4d\u6307\u6559\u3002", 
      "date_published": "2022-10-11T08:56:58+00:00", 
      "title": "django admin \u90e8\u5206\u81ea\u5e26\u7684 css \u6587\u4ef6 collectstatic\uff0c\u751f\u6210\u7684\u6587\u4ef6\u5927\u5c0f\u4e3a 0\uff1f", 
      "id": "https://www.v2ex.com/t/886127"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/elboble", 
        "name": "elboble", 
        "avatar": "https://cdn.v2ex.com/gravatar/3427d21885aca1e4e2149b2fdcf1b799?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/876228", 
      "date_modified": "2022-08-29T08:23:41+00:00", 
      "content_html": "<p>\u7c7b\u4f3c\u4e8e\u90a3\u79cd\u5b9a\u65f6\u62a2\u8d2d\u7684\u903b\u8f91\u3002</p>\n<p>\u65f6\u95f4\u6ca1\u5230\u4e4b\u524d\u662f\u4e2a\u4ecb\u7ecd\u9875\u9762\uff0c\u65f6\u95f4\u5230\u4e86\u4e4b\u540e\u8fdb\u5165\u771f\u6b63\u7684 view \u5904\u7406\u51fd\u6570\u3002</p>\n<p>\u89e6\u53d1\u6761\u4ef6\u4e0d\u4e00\u5b9a\u662f\u65f6\u95f4\uff0c\u4e5f\u53ef\u80fd\u662f\u540e\u53f0\u63a7\u5236\u7684\u3002\u5c31\u662f\u8981\u505a\u5230\u7a0b\u5e8f\u4e0d\u91cd\u542f\uff0c\u540c\u4e00 url \u5bf9\u5e94\u7684 view \u53d8\u4e86\u3002</p>\n<p>\u6211\u662f\u8fd9\u6837\u505a\u7684\uff0c\u52a0\u4e86\u4e2a\u5168\u5c40\u53d8\u91cf\uff0c\u7136\u540e\u5728 url \u5bf9\u5e94\u4e2a view \u51fd\u6570\u91cc\u505a\u5224\u65ad\uff0c\u540e\u53f0\u6539\u53d8\u8fd9\u4e2a\u5168\u5c40\u53d8\u91cf\uff0c\u6267\u884c\u4e0d\u540c\u7684 view \u51fd\u6570\u3002</p>\n<p>IS_RELEASE \u662f\u5168\u5c40\u53d8\u91cf\uff0centrance \u51fd\u6570\u662f\u5165\u53e3\u51fd\u6570\uff0crelease \u51fd\u6570\u662f\u6539\u53d8\u5165\u53e3\u7684\u89c6\u56fe\u51fd\u6570\u3002</p>\n<p>IS_RELEASE = False  </p>\n<p>def entrance(request):<br/>\n\u2002 global IS_RELEASE<br/>\n\u2002 if IS_RELEASE:<br/>\n\u2002 \u2002return index2022(request)<br/>\n\u2002 else:<br/>\n\u2002 return index2(request)  </p>\n<p>@login_required<br/>\ndef release(request):<br/>\nglobal IS_RELEASE<br/>\nif IS_RELEASE:<br/>\nIS_RELEASE = False<br/>\nelse:<br/>\nIS_RELEASE = True<br/>\nreturn redirect(\"/conf/\")  </p>\n<p>\u8fd9\u4e2a\u65b9\u6cd5\u5728\u672c\u5730\u8c03\u8bd5\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u4e0a\u5230\u670d\u52a1\u5668\u540e\uff0c\u51fa\u73b0\u6267\u884c release \u51fd\u6570\u540e IS_RELEASE \u6ca1\u6309\u9884\u671f\u6539\u53d8\uff0c\u6216\u8005\u6709\u79d2\u7ea7\u7684\u5ef6\u8fdf\uff0c\u6211\u731c\u662f\u4e0d\u662f\u6709 cdn \u7684\u5f71\u54cd\uff0c\u4f46\u662f\u8fd9\u4e2a\u90fd\u5e94\u8be5\u662f\u52a8\u6001\u9875\u9762\uff0c\u6bcf\u4e2a\u8bf7\u6c42\u90fd\u8981\u56de\u670d\u52a1\u5668\u5904\u7406\u7684\u3002</p>\n", 
      "date_published": "2022-08-29T08:16:31+00:00", 
      "title": "Django \u600e\u4e48\u505a\u540c\u4e00\u4e2a url\uff0c\u5bf9\u5e94\u4e0d\u540c\u7684 view \u51fd\u6570\uff1f", 
      "id": "https://www.v2ex.com/t/876228"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/HashV2", 
        "name": "HashV2", 
        "avatar": "https://cdn.v2ex.com/avatar/115c/2cbe/465449_large.png?m=1725845603"
      }, 
      "url": "https://www.v2ex.com/t/873759", 
      "title": "\u8bf7\u6559 drf \u5168\u5c40\u5c01\u88c5 response \u7684\u4f18\u96c5\u5b9e\u73b0", 
      "id": "https://www.v2ex.com/t/873759", 
      "date_published": "2022-08-18T07:10:18+00:00", 
      "content_html": "<h4>\u5728\u4f7f\u7528 drf \u7684\u65f6\u5019\uff0c\u5f53\u6709\u9519\u8bef\u7684\u65f6\u5019\u9ed8\u8ba4\u7684 http response \u90fd\u662f http state \uff0c\u4f46\u662f\u548c\u524d\u7aef\u7684\u4ea4\u4e92\u4e2d\uff0c\u524d\u7aef\u5e0c\u671b\u5f97\u5230\u5982\u4e0b\u7684\u8fd9\u79cd json \u5f62\u5f0f\uff0c\u5305\u62ec\u6211\u81ea\u5df1\u5199\u524d\u7aef\u7684\u65f6\u5019\u4e5f\u60f3\u8981\u8fd9\u79cd\u5f62\u5f0f\u7684\u8fd4\u56de\u3002</h4>\n<pre><code class=\"language-json\">{\n   \"code\": 200,\n   \"msg\": \"ok\",\n   \"data\": { some data }\n}\n{\n   \"code\": 404,\n   \"msg\": \"http not found\",\n   \"data\": null\n}\n</code></pre>\n<p>\u6211\u8bf4\u4e00\u4e0b\u6211\u4e4b\u524d\u7684\u5b9e\u73b0\uff0c\u8fd9\u79cd\u5b9e\u73b0\u6211\u8ba4\u4e3a\u5f88\u602a\uff0c\u800c\u4e14\u5e76\u4e0d\u80fd\u5b8c\u7f8e\u5c01\u88c5\u4e00\u4e9b 500 \u9519\u8bef\uff0c\u60f3\u8bf7\u6559\u4e00\u4e0b\u6709\u6ca1\u6709\u4ec0\u4e48\u53ef\u4ee5\u4f18\u96c5\u7684\u65b9\u5f0f\u3002</p>\n<hr/>\n<p>\u9996\u5148\u6211\u4f7f\u7528\u4e00\u4e2a dataclasses.dataclass \u8fdb\u884c\u5b9a\u4e49\u8fd4\u56de\u6570\u636e\u7ed3\u6784(code,msg,data)</p>\n<pre><code class=\"language-python3\">from dataclasses import dataclass\nfrom typing import Any\n\n\n@dataclass\nclass Result:\n    code: int\n    msg: str\n    data: Any\n</code></pre>\n<p>\u540e\u9762\u6211\u9700\u8981\u6253\u5404\u79cd\u8865\u4e01</p>\n<ul>\n<li>\u5728 api view \u4e2d\u4f7f\u7528 JsonResponse \u8fdb\u884c\u8fd4\u56de\uff0c\u5f53\u7136\u4e5f\u5305\u62ec\u4e00\u4e9b\u4e1a\u52a1\u4e0a\u7684\u903b\u8f91\u5224\u65ad\u90fd\u53ef\u4ee5\u5728\u8fd9\u91cc\u8fdb\u884c\u5904\u7406</li>\n</ul>\n<pre><code class=\"language-python3\">from dataclasses import asdict\nfrom django.http import JsonResponse\nfrom rest_framework import views\n\n\nclass SomeApiView(views.APIView):\n\n    def get(, request, *args, **kwargs) -&gt; JsonResponse:\n        # do something\n        return JsonResponse(asdict(Result(200, 'ok', null)))\n</code></pre>\n<ul>\n<li>modelviewset \u7684\u5904\u7406\uff08\u7ee7\u627f mixin \u5bf9\u8fd4\u56de\u505a\u5904\u7406\uff09\uff0c\u5982\u4e0b\uff0c\u53ea\u5199\u4e86\u4e00\u4e2a\u4e3e\u4f8b\uff1a</li>\n</ul>\n<pre><code>from dataclasses import asdict\nfrom django.http import JsonResponse\nfrom rest_framework import status, mixins\n\nclass MyRetrieveModelMixin(mixins.RetrieveModelMixin):\n\n    def retrieve(self, request, *args, **kwargs):\n        instance = self.get_object()\n        serializer = self.get_serializer(instance)\n        return JsonResponse(asdict(Result(200, 'ok', serializer.data)))\n</code></pre>\n<ul>\n<li>\u5168\u5c40\u5f02\u5e38\u5904\u7406\uff0c\u5bf9\u7c7b\u4f3c drf-jwt,drf-serializer \u4e2d\u7684\u4e00\u4e9b\u9519\u8bef\uff0c\u53ea\u80fd\u5728 <a href=\"http://settings.py\" rel=\"nofollow\">settings.py</a> \u4e2d\u7684 rest framework \u4e2d\u8fdb\u884c\u5f02\u5e38\u5904\u7406\u914d\u7f6e\uff0c\u5e76\u4e14\u7528\u8fd9\u4e2a\u65b9\u6cd5\u53bb\u5904\u7406\uff0c\u8fd9\u79cd\u5f62\u5f0f\u603b\u611f\u89c9\u7279\u522b\u602a\u3002</li>\n</ul>\n<pre><code class=\"language-python3\"># \u914d\u7f6e\nREST_FRAMEWORK = {\n    # ...\n    # \u5f02\u5e38\u5904\u7406\uff08\u7edf\u4e00\u5c01\u88c5\u4e3a code msg data \u683c\u5f0f\uff09\n    'EXCEPTION_HANDLER': 'utils.result_handler.custom_exception_handler',\n    # ...\n}\n</code></pre>\n<pre><code class=\"language-python3\">def custom_exception_handler(exc, context):\n\t\n    response = exception_handler(exc, context)\n    \n    if response is not None:\n    \t# logger\n    \t# \u8fdb\u884c\u4e00\u4e9b\u5904\u7406 \u5904\u7406\u6210 Result(code, msg, data)\n        # \u8fd9\u91cc\u5bf9\u5f88\u591a\u5904\u7406\uff0c\u5c24\u5176 serializer \u4e2d\u7684\u5904\u7406 \u7279\u522b\u70e6\uff01\n        # \u6bd4\u5982\u624b\u673a\u53f7\u552f\u4e00\u7ea6\u675f\uff0c\u524d\u7aef\u5c31\u60f3\u8981 code:400 msg:\"\u8be5\u624b\u673a\u53f7\u5df2\u88ab\u4f7f\u7528\"\n        return JsonResponse(...)\n</code></pre>\n<h3>\u8bf4\u5b9e\u8bdd\u8fd9\u4e9b\u8865\u4e01\u770b\u7684\u6211\u6709\u4e9b\u96be\u53d7\uff0c\u5f88\u60f3\u77e5\u9053\u6709\u6ca1\u6709\u4ec0\u4e48\u4f18\u96c5\u7684\u5904\u7406\u65b9\u5f0f</h3>\n<h3>thanks \uff01</h3>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/longmeier90", 
        "name": "longmeier90", 
        "avatar": "https://cdn.v2ex.com/gravatar/8dbc4123e8644a41d1409ad8dd0d0b35?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/863475", 
      "title": "django \u91cc\u9762\u7684\u539f\u751f\u7684 sql \u67e5\u8be2\uff0c\u4f1a\u4e00\u76f4\u5360\u7528\u6570\u636e\u5e93\u8fde\u63a5\u5417", 
      "id": "https://www.v2ex.com/t/863475", 
      "date_published": "2022-07-01T08:50:49+00:00", 
      "content_html": "<p>\u6700\u8fd1\u6570\u636e\u5e93\u8fde\u63a5\u4e00\u76f4\u62a5\u8b66\u3002\u6392\u67e5\u4e86\u4e00\u4e0b\u662f\u6709\u4e00\u4e2a django \u9879\u76ee\u5360\u7528\u5927\u91cf\u7684\u6570\u636e\u5e93\u8fde\u63a5\u3002\u6309\u7167\u7528\u6237\u91cf\u4e0d\u592a\u53ef\u80fd\uff0c\u6709\u4e00\u4e2a\u95ee\u9898\u662f\u8fd9\u4e2a django \u9879\u76ee\u90fd\u662f\u7528\u539f\u751f SQL \u67e5\u8be2\u6ca1\u6709\u7528 ORM \u3002</p>\n<pre><code>from django.db import connection\n\nwith connection.cursor() as cursor:\n\n    cursor.execute(sql, params=params_dict)\n    result = dictfetchall(cursor)\n\nreturn result\n</code></pre>\n<p>\u8fd9\u79cd\u5199\u6cd5\u6709\u95ee\u9898\u5417?</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/colatea", 
        "name": "colatea", 
        "avatar": "https://cdn.v2ex.com/avatar/5ecd/3507/304491_large.png?m=1650853161"
      }, 
      "url": "https://www.v2ex.com/t/855520", 
      "title": "Django ORM \u5982\u4f55\u624d\u80fd\u5728 save_model \u63d2\u5165\u6570\u636e\u5e93\u5b8c\u6210\u540e,\u518d\u6b21\u66f4\u65b0\u6570\u636e\u5e93?", 
      "id": "https://www.v2ex.com/t/855520", 
      "date_published": "2022-05-26T11:00:52+00:00", 
      "content_html": "\u6211\u9700\u8981\u5728\u4e00\u6761\u8bb0\u5f55\u5b8c\u6210\u63d2\u5165\u6570\u636e\u5e93\u540e,\u8c03\u7528 os.system \u6267\u884c\u5176\u4ed6\u7684\u547d\u4ee4,\u800c\u6b64\u547d\u4ee4\u4e2d\u6709\u5bf9\u8fd9\u6761\u8bb0\u5f55\u7684 update \u64cd\u4f5c,\u76ee\u524d\u65e0\u8bba\u662f\u91cd\u5199 save_model,model.save,\u4fa6\u542c post_save.connect \u4fe1\u53f7,\u90fd\u4f1a\u62a5\u6b7b\u9501 Lock wait timeout exceeded; try restarting transaction<br /><br />\u8bf7\u5404\u4f4d\u5927\u795e\u6307\u70b9"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/lyang", 
        "name": "lyang", 
        "avatar": "https://cdn.v2ex.com/avatar/e9d9/6252/437626_large.png?m=1655858715"
      }, 
      "url": "https://www.v2ex.com/t/852128", 
      "date_modified": "2022-05-11T06:40:23+00:00", 
      "content_html": "<p>\u4e00\u4e2a\u5c0f\u7684\u5e97\u94fa\u9879\u76ee\uff0c\u9700\u8981\u5b9e\u73b0\u81ea\u52a8\u4e0b\u67b6\u7684\u529f\u80fd\uff0c\u6bd4\u5982\uff0c\u9875\u9762\u4e0a\u8bbe\u7f6e\u4e86\u4e0b\u67b6\u65f6\u95f4\u4e3a 2022 \u5e74 6 \u6708 1 \u65e5 10:00:00,\u7136\u540e\u5728\u6307\u5b9a\u65f6\u95f4\u4e0b\u67b6\u3002</p>\n<p>\u4ea7\u54c1\u9700\u6c42</p>\n<ul>\n<li>\u4e0d\u8981\u5b9a\u671f\u89e6\u53d1\u7684\u5b9a\u65f6\u4efb\u52a1\uff0c\u6bd4\u5982 1 \u5206\u949f\u4e00\u6b21\u67e5\u6570\u636e\u5e93\uff0c\u4e0d\u591f\u7cbe\u51c6\uff0c\u8017\u8d44\u6e90</li>\n<li>\u7528\u6307\u5b9a\u65f6\u95f4\u4efb\u52a1\u7684\u5f62\u5f0f\u89e6\u53d1\u4fee\u6539\u4e0a\u4e0b\u67b6\u72b6\u6001\uff0c\uff08\u7528\u4e0b\u67b6\u65f6\u95f4\u5224\u65ad\u4e0a\u4e0b\u67b6\u7684\u65b9\u5f0f\uff0c\u8fd9\u6837\u5c31\u4e0d\u7528\u5b9a\u65f6\u4efb\u52a1\u89e6\u53d1\uff0cpass \uff09</li>\n</ul>\n<p>\u6240\u4ee5\u60f3\u95ee\u95ee\uff0cdjango \u6709\u6ca1\u6709\u63a5\u53e3\u89e6\u53d1\uff0c\u521b\u5efa\u4efb\u52a1\uff0c\u5728\u6307\u5b9a\u7684\u65e5\u671f\u65f6\u95f4\u8fd0\u884c\u4e00\u6b21\u7684\u6a21\u5757\u3002</p>\n", 
      "date_published": "2022-05-11T01:52:43+00:00", 
      "title": "django \u5b9a\u65f6\u89e6\u53d1\u4efb\u52a1", 
      "id": "https://www.v2ex.com/t/852128"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/dearmymy", 
        "name": "dearmymy", 
        "avatar": "https://cdn.v2ex.com/gravatar/db518e469d91f54ee805c2069e84e819?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/850321", 
      "title": "\u8bf7\u95ee django \u600e\u4e48\u9ad8\u6548\u7684\u83b7\u53d6\u8303\u56f4\u5185\u4e00\u6761\u968f\u673a\u6570\u636e", 
      "id": "https://www.v2ex.com/t/850321", 
      "date_published": "2022-05-01T03:02:42+00:00", 
      "content_html": "<p>\u51e0\u767e\u4e07\u6570\u636e\u6bcf\u6b21\u83b7\u53d6\u4e00\u4e2a\u968f\u673a\u6570\u636e\n\u6211\u67e5\u8be2\u6709\u7528 oder_by(?)\n\u8fd8\u6709\u83b7\u5f97\u8303\u56f4\u5185\u4e3b\u952e id \uff0c\u505a random \uff0c\u4f46\u662f\u7531\u4e8e\u6211\u5220\u9664\u8fc7\u5f88\u591a\u6570\u636e\uff0c\u5bfc\u81f4\u4e3b\u952e id \u5e76\u4e0d\u8fde\u7eed\uff0c\u8bf7\u95ee\u8fd9\u4e2a\u600e\u4e48\u5904\u7406\n\u6216\u8005\u8fd8\u6709\u4ec0\u4e48\u66f4\u597d\u7684\u65b9\u6cd5</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ila", 
        "name": "ila", 
        "avatar": "https://cdn.v2ex.com/gravatar/faaf175503307561b7b576285cea4e7f?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/847701", 
      "title": "\u8bf7\u95ee Django ORM \u5982\u4f55\u5b9e\u73b0 left join?", 
      "id": "https://www.v2ex.com/t/847701", 
      "date_published": "2022-04-18T09:02:25+00:00", 
      "content_html": "<ul>\n<li>\u539f\u59cb sql \u8bed\u53e5\u5982\u4e0b:</li>\n</ul>\n<pre><code>select be.id, be.fullName1, be.workEmail\nfrom employees as be\n         left join id_mapping as ci\n                   on be.id = ci.user_id\nwhere be.id like '%Steven%'\n   or be.fullName1 like '%Steven%'\n   or be.workEmail like '%Steven%'\n   or ci.new_id like '%Steven%'\ngroup by be.id\n\n</code></pre>\n<ul>\n<li>\u7814\u7a76\u4e86\u4e00\u4e0b\u5348,\u6682\u65e0\u5934\u7eea.\u5148\u7528 raw \u8fd0\u884c\u7740 sql \u8bed\u53e5.</li>\n<li>\u8bf7\u5404\u4f4d\u51fa\u624b\u76f8\u52a9.</li>\n</ul>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/maloneleo88", 
        "name": "maloneleo88", 
        "avatar": "https://cdn.v2ex.com/avatar/4c87/b40f/467245_large.png?m=1650892595"
      }, 
      "url": "https://www.v2ex.com/t/845045", 
      "date_modified": "2022-04-07T08:13:06+00:00", 
      "content_html": "<p>\u7528 Django \u81ea\u5e26\u540e\u53f0\uff0c\u505a\u4e0a\u4f20\u56fe\u7247\u529f\u80fd\u3002\u9884\u89c8\u7684\u65f6\u5019\u6253\u4e0d\u5f00\u3002</p>\n<p>\u56fe\u7247\u6b63\u786e\u7684\u8def\u5f84\u662f\uff1a</p>\n<pre><code>http://127.0.0.1:8000/media/img/2022/02/13/%E6%9C%AA%E6%A0%87%E9%A2%98-1_z6YBLvG.jpg\n</code></pre>\n<p>\u540e\u53f0\u8d85\u7ea7\u94fe\u63a5\u7684\u8def\u5f84\u662f:</p>\n<pre><code>http://127.0.0.1:8000/admin/web/detectioninfo/4/change/media/img/2022/02/13/%E6%9C%AA%E6%A0%87%E9%A2%98-1_z6YBLvG.jpg\n</code></pre>\n<p>\u8fd8\u6ca1\u5b66\u660e\u767d\uff0c\u4e0d\u77e5\u9053\u54ea\u91cc\u7684\u95ee\u9898\uff0c\u6c42\u6307\u70b9</p>\n<p><a href=\"http://url.py\" rel=\"nofollow\">url.py</a> \u7684 urlpatterns</p>\n<pre><code class=\"language-python\">\n    re_path(r'^media/(?P&lt;path&gt;.*)$', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),\n</code></pre>\n<p><a href=\"http://models.py\" rel=\"nofollow\">models.py</a></p>\n<pre><code class=\"language-python\">class DetectionInfo(models.Model):\n\n    img_1 = models.ImageField(verbose_name=\"\u73b0\u573a\u56fe\", upload_to='img/%Y/%m/%d',blank=True,null=True)\n\n</code></pre>\n", 
      "date_published": "2022-04-05T08:39:28+00:00", 
      "title": "[\u6c42\u52a9] Django \u56fe\u7247\u8def\u5f84\u7684\u95ee\u9898", 
      "id": "https://www.v2ex.com/t/845045"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ZAXON", 
        "name": "ZAXON", 
        "avatar": "https://cdn.v2ex.com/avatar/1bef/5917/285059_large.png?m=1637307444"
      }, 
      "url": "https://www.v2ex.com/t/843369", 
      "title": "\u4e3a\u4ec0\u4e48 django ORM \u7684\u66f4\u65b0\u65f6\u95f4\u5b57\u6bb5\u9009\u62e9\u5728\u7a0b\u5e8f\u5185\u90e8\u751f\u6210(auto_now)\uff0c\u800c\u4e0d\u4f7f\u7528 MYSQL \u7684 on update?", 
      "id": "https://www.v2ex.com/t/843369", 
      "date_published": "2022-03-28T05:58:36+00:00", 
      "content_html": "<p>\u5982\u9898, \u7279\u6307\u7684\u662f update_time \u8fd9\u6837\u7684\u666e\u901a\u5b57\u6bb5, \u5f53\u4e00\u6761\u6570\u636e\u66f4\u65b0\u65f6, \u4f1a\u81ea\u52a8\u66f4\u65b0\u6210\u5f53\u524d\u7684\u65f6\u95f4.</p>\n<p>\u662f\u4e3a\u4e86\u51cf\u8f7b\u6570\u636e\u5e93\u538b\u529b\u5417?\u8fd8\u662f\u8bf4\u517c\u5bb9\u5176\u4ed6\u6ca1\u6709 <em>on update</em> \u7684\u6570\u636e\u5e93?</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/inSpring", 
        "name": "inSpring", 
        "avatar": "https://cdn.v2ex.com/avatar/efed/9651/218790_large.png?m=1758511207"
      }, 
      "url": "https://www.v2ex.com/t/842354", 
      "date_modified": "2022-04-07T13:06:28+00:00", 
      "content_html": "\u6253\u7b97\u642d\u5efa\u4e00\u4e2a\u4e2a\u4eba\u535a\u5ba2\uff0c\u6c42\u63a8\u8350 python \u5f00\u6e90\u7684\u535a\u5ba2\u7cfb\u7edf\u3002", 
      "date_published": "2022-03-23T06:46:06+00:00", 
      "title": "\u6709\u57fa\u4e8e django \u7684\u5f00\u6e90\u535a\u5ba2\u7cfb\u7edf\u5417\uff1f", 
      "id": "https://www.v2ex.com/t/842354"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/volvo007", 
        "name": "volvo007", 
        "avatar": "https://cdn.v2ex.com/gravatar/fe03df4711802704179677d82138d566?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/831650", 
      "date_modified": "2022-02-02T04:02:58+00:00", 
      "content_html": "<p>\u60f3\u4e86\u534a\u5929\u4e5f\u4e0d\u77e5\u9053\u600e\u4e48\u7528\u7b80\u6d01\u7684\u65b9\u5f0f\u63cf\u8ff0, \u6240\u4ee5\u641c\u7d22\u5f15\u64ce\u91cc\u9762\u4e5f\u6ca1\u627e\u5230\u7279\u522b\u5bf9\u5e94\u7684\u65b9\u6cd5.</p>\n<p>\u9700\u6c42\u4e0a\u5927\u6982\u662f\u8fd9\u4e48\u63cf\u8ff0:</p>\n<ol>\n<li>\u6709\u4e00\u4e2a\u5305\u62ec\u4e00\u4e9b\u9759\u6001\u5c5e\u6027\u7684\u8868, \u6bd4\u5982<code>\u7528\u6237\u8868</code>. \u91cc\u9762\u6709\u4e24\u6761\u8bb0\u5f55\u662f <code>id=1, name='Tom', age=28</code>, <code>id=2, name='Tom', age=35</code>. \u6ce8\u610f\u5230\u6709\u4e24\u4e2a\u540c\u540d\u7684\u7528\u6237, \u662f\u7528<code>id</code> \u4fdd\u8bc1\u552f\u4e00\u6027\u7684</li>\n<li>\u73b0\u5728\u8fd8\u6709\u4e00\u4e2a\u9879\u76ee\u8868, \u8981\u5c06\u9879\u76ee\u5206\u6d3e\u7ed9\u67d0\u4e2a\u4eba. \u51fa\u4e8e\u4f7f\u7528\u4e0a\u7684\u8003\u8651, \u80af\u5b9a\u4e0d\u4f1a\u76f4\u63a5\u63d0\u4f9b <code>id</code> \u8ba9\u7528\u6237\u586b\u5199, \u4e00\u822c\u90fd\u662f\u63d0\u4f9b <code>name</code> \u6bd4\u8f83\u5408\u7406. \u8fd9\u91cc\u7684\u95ee\u9898\u662f, <code>name</code> \u5b57\u6bb5\u662f\u6709\u91cd\u540d\u60c5\u51b5\u7684</li>\n</ol>\n<p>\u6240\u4ee5\u6211\u7684\u9700\u6c42\u662f, \u5f53\u7528\u6237\u9009\u62e9\u4e86 <code>Tom</code> \u8fd9\u4e2a\u4eba\u7684\u65f6\u5019, \u4f1a\u52a8\u6001\u663e\u793a\u8fd9\u4e2a <code>Tom</code> \u7684\u5176\u4ed6\u5c5e\u6027\u5728\u9875\u9762\u4e0a, \u53ef\u4ee5\u663e\u793a\u5728\u8868\u5355\u91cc\u81ea\u52a8\u8865\u5168, \u4e5f\u53ef\u4ee5\u505a\u4e2a\u6a21\u6001\u6846\u90fd\u884c(\u4f46\u6a21\u6001\u6846\u6700\u597d\u662f\u505a\u4e2a\u95ee\u53f7\u56fe\u6807, \u9f20\u6807\u60ac\u505c\u5728\u4e0a\u9762\u5c31\u663e\u793a)</p>\n<p>\u8fd9\u6837\u4e00\u6765, \u867d\u7136\u6709\u540d\u5b57\u91cd\u540d\u7684\u60c5\u51b5, \u4f46\u6211\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e2a\u4eba\u7684\u5176\u4ed6\u5c5e\u6027\u5206\u8fa8\u51fa\u6765\u67d0\u4e2a\u9879\u76ee\u662f\u5426\u5206\u914d\u7ed9\u4e86\u5408\u9002\u7684\u4eba (age \u5f53\u7136\u4e5f\u4f1a\u91cd\u590d, \u8fd9\u91cc\u53ea\u662f\u4e3e\u4e2a\u4f8b\u5b50)</p>\n<p>\u5982\u679c\u662f django \u91cc\u9762\u81ea\u5df1\u5199\u7684\u9875\u9762, \u7528 ajax \u5411\u6570\u636e\u5e93\u67e5\u8be2\u4e00\u4e0b\u5e94\u8be5\u5c31\u597d\u4e86, \u4f46\u662f\u73b0\u5728\u6682\u65f6\u8981\u5229\u7528\u4e00\u4e0b\u73b0\u6210\u7684 django admin \u6a21\u5757\u7684\u8bdd, \u8981\u600e\u4e48\u5728 django admin change \u9875\u9762\u5b9e\u73b0\u8fd9\u4e2a\u529f\u80fd\u5462?</p>\n<p>\u6211\u627e\u8fc7\u4e00\u4e9b\u65b9\u6cd5, \u6bd4\u5982\u6269\u5c55 django admin change \u8fd9\u4e2a\u6a21\u7248\u4e4b\u7c7b\u7684, \u4f46\u4e0d\u786e\u5b9a\u8fd9\u4e48\u505a\u662f\u4e0d\u662f\u6700\u4f73\u5b9e\u8df5</p>\n<p>\u8c22\u8c22\u5927\u4f6c\u4eec\u8d50\u6559</p>\n<hr/>\n<p>\u660e\u660e\u9009\u4e86 markdown \u683c\u5f0f, \u4f46\u662f\u4e0d\u77e5\u9053\u4e3a\u4ec0\u4e48\u6ca1\u6709\u6b63\u786e\u663e\u793a\u4ee3\u7801\u5f15\u7528\u2026\u2026</p>\n", 
      "date_published": "2022-02-02T04:01:00+00:00", 
      "title": "Django admin \u5f53\u4e2d\u52a8\u6001\u663e\u793a\u5916\u952e\u7684\u76f8\u5173\u5c5e\u6027", 
      "id": "https://www.v2ex.com/t/831650"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/wchluxi", 
        "name": "wchluxi", 
        "avatar": "https://cdn.v2ex.com/avatar/fb04/c51d/513435_large.png?m=1709792558"
      }, 
      "url": "https://www.v2ex.com/t/829216", 
      "date_modified": "2022-01-19T05:53:29+00:00", 
      "content_html": "<h1>\u80cc\u666f</h1>\n<p>nginx+uwsgi+django \u6846\u67b6\u4e0b\uff0c\u7528 django-apscheduler \u5b9a\u65f6\u6267\u884c\u4efb\u52a1\uff0c\u4f46\u6211\u7684\u4efb\u52a1\u662f\u4fdd\u5b58\u5728\u5185\u5b58(MemoryJobStore)\uff0c\u4e0d\u80fd\u7528\u6570\u636e\u5e93\u4fdd\u5b58\uff08\u56e0\u4e3a\u6570\u636e\u5e93\u7528\u7684\u662f sqlite \uff0c\u4efb\u52a1\u672c\u8eab\u9700\u8981\u8bfb\u53d6\u8bfb\u5199\u6570\u636e\u5e93\uff0c\u4f1a\u9020\u6210 database is locked \u5bfc\u81f4\u540e\u9762\u4efb\u52a1\u4e0d\u6267\u884c\uff09\u3002</p>\n<h1>\u95ee\u9898</h1>\n<p>\u600e\u4e48\u83b7\u53d6\u5230 scheduler \u5b9e\u4f8b\uff1f\u56e0\u4e3a\u73b0\u5728\u4e0d\u786e\u5b9a\u662f\u5426\u6dfb\u52a0\u4e86\u4efb\u52a1\uff0c\u539f\u6765\u5728\u672c\u5730 debug \u4e0b\u5c06 scheduler \u8bbe\u6210\u5168\u5c40\u53d8\u91cf\uff0c\u901a\u8fc7\u5168\u5c40\u53d8\u91cf\u548c get_jobs()\u65b9\u6cd5\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u4efb\u52a1\u5217\u8868\uff0c\u4f46\u8fd9\u4e2a\u65b9\u6cd5\u8c8c\u4f3c\u5728\u670d\u52a1\u5668\u7684\u751f\u4ea7\u73af\u5883\u4e0a\u7528\u4e0d\u4e86\u3002</p>\n<p>\u6709\u5927\u795e\u63d0\u4e00\u4e0b\u5efa\u8bae\u5417\uff1f</p>\n", 
      "date_published": "2022-01-19T05:53:10+00:00", 
      "title": "Django \u5982\u4f55\u83b7\u53d6 apscheduler \u7684 scheduler \u5b9e\u4f8b\uff1f", 
      "id": "https://www.v2ex.com/t/829216"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/ila", 
        "name": "ila", 
        "avatar": "https://cdn.v2ex.com/gravatar/faaf175503307561b7b576285cea4e7f?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/822862", 
      "title": "django3 \u7684 i18n \u6c49\u5316\u6c42\u6551", 
      "id": "https://www.v2ex.com/t/822862", 
      "date_published": "2021-12-17T09:37:40+00:00", 
      "content_html": "\u5b98\u65b9\u548c\u5176\u5b83\u8d44\u6599\u90fd\u770b\u5b8c\u4e86\uff0c\u8fd8\u662f\u8c03\u8bd5\u5931\u8d25\u3002<br /><br />\u6709\u4eba\u53ef\u4ee5\u5206\u4eab\u4e0b i18n,\u82f1\u6587\u7ffb\u8bd1\u6210\u4e2d\u6587\u7684 demo \u6216\u9879\u76ee\u5417"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/naijoag", 
        "name": "naijoag", 
        "avatar": "https://cdn.v2ex.com/gravatar/5121502f7cbfb10c10f08e967f427bf0?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/821002", 
      "date_modified": "2021-12-08T16:27:42+00:00", 
      "content_html": "<p>\u7b2c\u4e00\u5bb6\u516c\u53f8 \u7528 django+drf \u5199\u7684\u5f88\u723d\u611f\u89c9 c \u7aef\u4e1a\u52a1 \u4e1a\u52a1\u4e5f\u7b80\u5355</p>\n<p>\u7b2c\u4e8c\u5bb6\u516c\u53f8 b \u7aef\u4e1a\u52a1 saas \u5f00\u53d1 \u76f4\u63a5\u7528 django \u53c2\u6570\u6821\u9a8c\u90fd\u4e0d\u505a \u95ee\u4e86\u540c\u4e8b\u5c31\u8bf4 \u4e00\u822c\u90fd\u6309\u6b63\u786e\u7684\u4f20 \u53c2\u6570\u6709\u95ee\u9898\u5f00\u53d1\u7684\u65f6\u5019\u5c31\u89e3\u51b3\u4e86\u3002\u3002</p>\n<p>\u7b2c\u4e09\u5bb6\u516c\u53f8 \u4e5f\u662f\u76f4\u63a5\u7528 django \u503e\u5411\u539f\u751f sql \u4ee3\u7801\u770b\u7740\u633a\u96be\u53d7\u7684 \u4e00\u76f4\u62fc\u63a5 if xxx: sql += 'xxx' \u5199\u4e0b\u6765 \u4e00\u5927\u5806\u603c\u5728 views \u91cc\u9762 \u521a\u5f00\u59cb\u4e5f\u6bd4\u8f83\u62b5\u89e6 \u96be\u7ef4\u62a4 \u5bb9\u6613\u51fa\u8bed\u6cd5\u9519\u8bef \u5f00\u53d1\u6548\u7387\u4f4e \u611f\u89c9\u5199\u63a5\u53e3\u5c31\u8d3c\u6162 \u5148\u53bb navicat \u5199 sql \u8c03\u597d\u4e86 \u590d\u5236\u5230\u4ee3\u7801\u91cc\u9762 \u4e5f\u4e0d\u7528 orm \u5efa\u8868 \u5148 navicat \u5efa\u8868 \u5efa\u597d\u4e86\u5728\u5199 model \u3002\u3002\u3002\u4e0d\u8fc7 sql \u80fd\u529b\u662f\u953b\u70bc\u4e86\uff0c\u4f46\u611f\u89c9\u5f00\u53d1\u6548\u7387\u4e0d\u884c\uff0c\u611f\u89c9\u8fd9\u6837\u6ca1\u5fc5\u8981\u7528 django</p>\n<p>\u4f60\u4eec\u516c\u53f8\u7684 django \u9879\u76ee\u662f\u600e\u6837\u7684</p>\n", 
      "date_published": "2021-12-08T16:26:36+00:00", 
      "title": "\u4f60\u4eec\u516c\u53f8\u7684 django \u9879\u76ee\u5982\u4f55", 
      "id": "https://www.v2ex.com/t/821002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/zhoudaiyu", 
        "name": "zhoudaiyu", 
        "avatar": "https://cdn.v2ex.com/avatar/b75f/9ee0/163414_large.png?m=1682659533"
      }, 
      "url": "https://www.v2ex.com/t/816651", 
      "title": "Django \u7684 ORM \u7684 exclude \u548c filter \u7684\u533a\u522b\u5230\u5e95\u662f\u5565\uff1f", 
      "id": "https://www.v2ex.com/t/816651", 
      "date_published": "2021-11-19T13:38:20+00:00", 
      "content_html": "\u8868\u7684\u5b9a\u4e49\u548c\u4e24\u4e2a\u67e5\u8be2\u5982\u4e0b <div><a target=\"_blank\" href=\"https://gist.github.com/BiTree/b0bea7b9c91e04b6a699608f527dea58\" rel=\"nofollow noopener\" target=\"_blank\">https://gist.github.com/BiTree/b0bea7b9c91e04b6a699608f527dea58</a> <button onclick=\"lazyGist(this)\">\u00a0\u663e\u793a Gist \u4ee3\u7801\u00a0</button></div><br />\u60f3\u8fc7\u6ee4\u6ee1\u8db3 A \u8868\u4e2d age \u5927\u4e8e\u7b49\u4e8e 13 \u7684\uff0c\u4e14\u5173\u8054 B \u8868\u7684\uff0c\u4e14\u5173\u8054\u7684 B \u8868\u4e2d\u8bb0\u5f55\u7684 is_admin \u4e3a\u771f\u7684\u6240\u6709 A \u8868\u8bb0\u5f55\uff0c\u4e3a\u5565\u4e0a\u9762\u7684 queryset \u5565\u90fd\u67e5\u4e0d\u51fa\u6765\uff0c\u4f46\u662f\u4e0b\u9762\u7684\u80fd\u67e5\u51fa\u6765\u5462\uff1f\u770b\u4e86\u5b98\u7f51\u611f\u89c9 filter \u548c exclude \u6ca1\u5565\u533a\u522b\u554a\uff0c\u90fd\u662f\u8fc7\u6ee4\u51fa\u60f3\u8981\u7684\u4e1c\u897f\uff0c\u5c31\u662f select foo from bar where xxx=yyy \uff08 filter \uff09\uff0cselect foo from bar where xxx!=yyy \uff08 exclude \uff09\u3002\u6c42\u5927\u4f6c\u89e3\u91ca\u4e00\u4e0b\u3002"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/firejoke", 
        "name": "firejoke", 
        "avatar": "https://cdn.v2ex.com/avatar/a098/a71b/77871_large.png?m=1636019138"
      }, 
      "url": "https://www.v2ex.com/t/816614", 
      "title": "\u5173\u4e8e\u5982\u4f55\u6839\u636e Accept \u7684 media_type \u8fd4\u56de\u4e0d\u540c\u7c7b\u578b\u5e8f\u5217\u5316\u6570\u636e\u7684\u60f3\u6cd5", 
      "id": "https://www.v2ex.com/t/816614", 
      "date_published": "2021-11-19T10:04:57+00:00", 
      "content_html": "<p>DRF \u7684 HyperLinkedRelatedField \u975e\u5e38\u597d\u7528\uff0c\u4f46\u8bf7\u6c42 Json \u683c\u5f0f\u7684\u6570\u636e\u7684\u65f6\u5019\uff0c\u8fd8\u8981\u5728\u6839\u636e\u8fd4\u56de\u7684 url \u5b57\u6bb5\u518d\u8bf7\u6c42\u4e00\u904d\uff0c\u6240\u4ee5\u6709\u4e86\u4e2a\u60f3\u6839\u636e\u8bf7\u6c42\u5934\u786e\u5b9a\u8fd4\u56de\u6570\u636e\u7c7b\u578b\u7684\u60f3\u6cd5  </p>\n<pre><code class=\"language-python\">class BaseSerializer(serializers.HyperlinkedModelSerializer):\n\n    def __new__(cls, *args, **kwargs):\n        media_field = kwargs[\"context\"][\"request\"].accepted_media_type\n        if hasattr(cls, \"related_fields\"):\n            for name, fields in cls.related_fields.items():\n                if \"text\" in media_field:\n                    field = fields.get(\"text\", None)\n                elif \"json\" in media_field:\n                    field = fields.get(\"json\", None)\n                elif \"yaml\" in media_field:\n                    field = fields.get(\"yaml\", None)\n                else:\n                    log.error(f\"{name} not found any type field\")\n                    continue\n                cls._declared_fields[name] = field\n                cls.Meta.fields += (name,)\n        return super().__new__(cls, *args, **kwargs)\n</code></pre>\n<p>\u6839\u636e\u8bf7\u6c42\u5934\u91cc\u5305\u542b\u7684 accepted_media_type \u6765\u5224\u65ad<br/>\n\u4f7f\u7528\u65b9\u6cd5  </p>\n<pre><code class=\"language-python\">class PermissionSerializer(BaseSerializer):\n    url = serializers.HyperlinkedIdentityField(\n        view_name='permission-detail',\n        lookup_field=\"codename\",\n        # lookup_url_kwarg=\"codename\",\n    )\n    name = serializers.CharField(max_length=255)\n    codename = serializers.CharField(max_length=100)\n    content_type = serializers.SlugRelatedField(\n        read_only=True,\n        slug_field=\"app_label\"\n    )\n    related_fields = dict(\n        user_set=dict(\n            text=serializers.HyperlinkedRelatedField(\n                view_name='user-detail', many=True,\n                queryset=User.objects.get_queryset(),\n                lookup_field=\"username\",\n                required=False,\n            ),\n            json=serializers.StringRelatedField(many=True),\n            yaml=serializers.StringRelatedField(many=True),\n        ),\n        group_set=dict(\n            text=serializers.HyperlinkedRelatedField(\n                view_name='group-detail', many=True,\n                queryset=Group.objects.get_queryset(),\n                lookup_field=\"name\",\n                required=False, ),\n            json=serializers.StringRelatedField(many=True),\n            yaml=serializers.StringRelatedField(many=True),\n        ),\n    )\n\n    class Meta:\n        model = Permission\n        fields = (\n            'name', 'codename', 'content_type', 'url'\n        )\n</code></pre>\n<p>\u6d4b\u8bd5\u53ef\u884c\uff0c\u8fd8\u6709\u5176\u4ed6\u597d\u7528\u7684\u65b9\u6cd5\u5417\uff1f<br/>\n\u6216\u8005\u8bf4\u6211\u8fd9\u4e2a\u65b9\u6cd5\u7b26\u5408 REST \u7684\u98ce\u683c\u5417\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Phishion", 
        "name": "Phishion", 
        "avatar": "https://cdn.v2ex.com/gravatar/a0139455b02066ce2ab1b251b06248e8?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/814479", 
      "title": "\u8bf7\u95ee Django \u5728\u542f\u52a8\u7684\u65f6\uff0c\u5982\u4f55\u6267\u884c\u4e00\u6b21\u6027\u4e1a\u52a1\u4ee3\u7801\uff1f", 
      "id": "https://www.v2ex.com/t/814479", 
      "date_published": "2021-11-10T09:44:11+00:00", 
      "content_html": "<p>\u6211\u5c1d\u8bd5\u8fc7\u5404\u5927\u7f51\u7ad9\u8f6c\u8f7d\u7684\u201c\u653e\u5728 urls \u6587\u4ef6\u91cc\u6267\u884c\u201d\u7684\u529e\u6cd5\uff0c\u4f46\u662f\u5f88\u4e0d\u5e78\uff0c\u6211\u53d1\u73b0\u4f1a\u6267\u884c\u591a\u6b21\u3002</p>\n<p>\u5177\u4f53\u4e1a\u52a1\u5c31\u662f\u8bbe\u8ba1\u4e86\u4e00\u4e2a Redis Set \u961f\u5217\u63a7\u5236\u5e76\u53d1\uff0c\u4efb\u52a1\u6b63\u5e38\u8fd0\u884c\u7684\u65f6\u5019\u662f\u53ef\u4ee5\u52a0\u5165\u3001\u5f39\u51fa\u7684\uff0c\u4f46\u662f\u5982\u679c\u4efb\u52a1\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u53d1\u751f\u6b7b\u673a\uff0c\u6216\u8005\u5176\u5b83\u672a\u77e5\u7684 Django \u6574\u4f53\u5d29\u6e83\uff0c\u867d\u7136\u6982\u7387\u5f88\u5c0f\uff0c\u4f46\u662f\u4e00\u65e6\u53d1\u751f\u8fd9\u4e2a\u961f\u5217\u5c31\u4f1a\u4ea7\u751f\u810f\u6570\u636e\uff0c\u6211\u73b0\u5728\u662f\u8003\u8651\u542f\u52a8 Django \u7684\u65f6\u5019\uff0c\u81ea\u52a8\u6e05\u7a7a\u8fd9\u4e2a\u961f\u5217\uff0c\u4f46\u662f\u5c31\u8981\u6c42\u8fd9\u4e2a\u51fd\u6570\u4ec5\u8fd0\u884c\u4e00\u6b21\uff0c\u5982\u679c\u5b9e\u73b0\u4e0d\u4e86\uff0c\u6211\u5c31\u53ea\u80fd\u8003\u8651\u5176\u4ed6\u529e\u6cd5\u3002</p>\n<p>\u8bf7\u95ee\u6709\u4ec0\u4e48\u5176\u4ed6\u65b9\u6cd5\u80fd\u8ba9\u6211\u7684\u4e1a\u52a1\u4ee3\u7801\u5728\u542f\u52a8\u7684\u65f6\u5019\u5c31\u8fd0\u884c\u4e00\u6b21\u4e48\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/kidblg", 
        "name": "kidblg", 
        "avatar": "https://cdn.v2ex.com/avatar/754d/da4b/1091_large.png?m=1647944857"
      }, 
      "url": "https://www.v2ex.com/t/813328", 
      "date_modified": "2021-11-05T09:01:15+00:00", 
      "content_html": "2009 \u5e74\uff0c\u90e8\u95e8\u8001\u5927\u5199 php \u5199\u70e6\u4e86\uff0c\u5076\u7136\u9047\u5230 django \uff0c\u89c9\u5f97\u5f88\u4e0d\u9519\uff0c\u8fd8\u6210\u4e86 django \u5b98\u65b9\u8d21\u732e\u8005\uff0c\u5b89\u5229\u6211\u4eec\u7528 django \uff0c\u90a3\u65f6\u5019\u8fd8\u662f django 0.3 \u7248\u3002\u867d\u7136\u8fd9\u4e9b\u5e74\u4e00\u76f4\u5728\u7528 django \uff0c\u73b0\u5728\u90fd django 3.X \u4e86\u3002\u867d\u8bf4\u6211\u4e5f\u770b\u8fc7 django template \u6a21\u5757\u7684\u6e90\u7801\uff0c\u4f46\u4e00\u76f4\u5728\u201c\u7528\u201d django \u7684\u5c42\u6b21\u4e0a\uff0c\u6ca1\u6709\u6df1\u6316\u4e0b\u53bb\uff0c\u6ca1\u6709\u7cfb\u7edf\u7684\u638c\u63e1\u3002\u7f51\u4e0a\u4e5f\u6ca1\u6709\u7cfb\u7edf\u7684\u8bb2 django \u6e90\u7801\u7684\u4e66\uff0c\u4e0a\u4e2a\u6708\u51fa\u4e86\u4e00\u672c\u8bb2 django \u6e90\u7801\u7684\u4e66\uff0c\u4f5c\u8005\u662f\u6c88\u806a\u3002\u6211\u8bfb\u4e86\u4e00\u90e8\u5206\uff0c\u611f\u89c9\u5199\u7684\u633a\u597d\uff0c\u63a8\u8350\u5404\u4f4d\u60f3\u6df1\u5165 django \u7684\u540c\u5b66\u3002<br /><br />\u5e74\u7eaa\u5927\u4e86\uff0c\u53d1\u73b0\u8fd8\u662f\u5f97\u8981\u6df1\u5165\u4e00\u4e2a\u9886\u57df\uff0c\u624d\u884c\u3002\u52ff\u5728\u6d6e\u6c99\u7b51\u9ad8\u53f0\u3002", 
      "date_published": "2021-11-05T09:00:12+00:00", 
      "title": "\u63a8\u8350\u4e00\u672c django \u6e90\u7801\u89e3\u6790\u7684\u4e66\u300a\u6df1\u5165\u7406\u89e3 Django \u6846\u67b6\u5185\u5e55\u4e0e\u5b9e\u73b0\u539f\u7406\u300b", 
      "id": "https://www.v2ex.com/t/813328"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/Phishion", 
        "name": "Phishion", 
        "avatar": "https://cdn.v2ex.com/gravatar/a0139455b02066ce2ab1b251b06248e8?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/813305", 
      "title": "\u8bf7\u95ee Django \u7684 JSONField \u5b57\u6bb5\u6709\u6ca1\u6709\u5fc5\u8981\u8fdb\u884c\u7d22\u5f15\uff1f", 
      "id": "https://www.v2ex.com/t/813305", 
      "date_published": "2021-11-05T07:42:08+00:00", 
      "content_html": "<p>\u6bd4\u5982\u6211\u6709\u4e00\u4e2a JSONField \u5b57\u6bb5\uff0c\u5185\u5bb9\u5982\u4e0b</p>\n<pre><code class=\"language-json\">{\n    \"A\": 1,\n    \"B\": 2\n}\n</code></pre>\n<p>\u6211\u60f3\u7b5b\u9009\u5b57\u6bb5 \"A\" \u7684\u503c\u4e3a 2 \uff0c\u6216\u8005 \u5b57\u6bb5\u91cc\u9762\u5305\u542b B \u8fd9\u4e2a Key \uff0c\u8fd9\u79cd\u6761\u4ef6\u4e0b\uff0cDjango \u7684\u7d22\u5f15\u4f1a\u52a0\u5feb\u67e5\u8be2\u901f\u5ea6\u4e48\uff1f</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/firejoke", 
        "name": "firejoke", 
        "avatar": "https://cdn.v2ex.com/avatar/a098/a71b/77871_large.png?m=1636019138"
      }, 
      "url": "https://www.v2ex.com/t/813300", 
      "title": "\u5206\u4eab\u4e00\u4e2a\u5728 Django \u7684 model \u91cc\uff0c\u4f7f\u7528\u5143\u7c7b\u52a8\u6001\u6dfb\u52a0\u76f8\u4f3c\u7684\u5e26\u81ea\u5b9a\u4e49\u4e2d\u95f4\u8868\u7684\u591a\u5bf9\u591a\u5173\u7cfb\u5b57\u6bb5\u7684\u65b9\u6cd5", 
      "id": "https://www.v2ex.com/t/813300", 
      "date_published": "2021-11-05T07:33:24+00:00", 
      "content_html": "<p>\u5f53\u6709\u591a\u4e2a model \u901a\u8fc7 ManyToManyField \u5173\u8054\u5230\u540c\u4e00\u4e2a\u76ee\u6807 model \u65f6\uff0c\u5982\u679c\u8fd9\u4e2a ManyToManyField \u9700\u8981\u989d\u5916\u7684\u5b57\u6bb5\uff0c\u5219\u9700\u8981\u5355\u72ec\u5b9a\u4e49\u4e00\u4e2a\u4e2d\u95f4\u8868\u3002<br/>\n\u8fd9\u65f6\u4e2d\u95f4\u8868\u9664\u4e86\u6307\u5411\u7684\u6e90\u8868\u662f\u4e0d\u4e00\u6837\u7684\uff0c\u5176\u4ed6\u5b57\u6bb5\u5305\u62ec\u76ee\u6807\u8868\u90fd\u662f\u4e00\u6837\u7684\uff0c\u6bd4\u5982\uff1a  </p>\n<pre><code class=\"language-python\"># base model\nclass Created(models.Model):\n    created = models.DateTimeField(auto_now_add=True)\n\n    class Meta:\n        abstract = True\n        required_db_vendor = \"postgresql\"\n\n\nclass CreatedModified(Created):\n    last = models.DateTimeField(auto_now=True)\n\n    class Meta(Created.Meta):\n        abstract = True\n</code></pre>\n<pre><code class=\"language-python\">class Argument(CreatedModified):\n    ...\n\n\nclass ArgumentThrough(CreatedModified):\n\t# argument \u4e2d\u95f4\u8868\u57fa\u7c7b\n    argument = models.ForeignKey(\n        to=Argument,\n        on_delete=models.PROTECT\n    )\n    value = models.JSONField(blank=True)\n\n    def clean(self):\n        argument_value_validator(self.argument, self.value)\n\n    class Meta(CreatedModified.Meta):\n        abstract = True\n\n</code></pre>\n<pre><code class=\"language-python\">class Inventory(CreatedModified):\n    ...\n\n    class Meta(CreatedModified.Meta):\n        abstract = True\n\n\nclass Host(Inventory):\n    inventory_variables = models.ManyToManyField(\n        to=Argument,\n        through=\"HostArgument\",\n        blank=True,\n        help_text=_(\"Variables for host\")\n    )\n\n\nclass HostArgument(ArgumentThrough):\n    # Host \u5230 Argument \u7684\u4e2d\u95f4\u8868\n    host = models.ForeignKey(\n        to=Host,\n        on_delete=models.CASCADE\n    )\n\n\nclass Group(Inventory):\n    inventory_variables = models.ManyToManyField(\n        to=Argument,\n        through=\"GroupArgument\",\n        blank=True,\n        help_text=_(\"Variables for group\")\n    )\n\n\n\nclass GroupArgument(ArgumentThrough):\n    # Group \u5230 Argument \u7684\u4e2d\u95f4\u8868\n    group = models.ForeignKey(\n        to=Group,\n        on_delete=models.CASCADE\n    )\n\n</code></pre>\n<p>\u53ef\u4ee5\u770b\u5230 Host \u548c Group \u7684\u4e24\u4e2a\u5173\u8054 Argument \u7684\u4e2d\u95f4\u8868\u9664\u4e86\u6307\u5411\u7684\u6e90\u8868\u4ee5\u5916\uff0c\u5176\u4ed6\u5b57\u6bb5\u51e0\u4e4e\u662f\u4e00\u6a21\u4e00\u6837\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u6539\u6210\u8fd9\u6837\uff1a  </p>\n<pre><code class=\"language-python\">class Host(Inventory):\n    ...\n\n\nclass Group(Inventory):\n    ...\n \n \n def add_related_field__argument(cls):\n    through_cls_dict = {\n        cls.__name__.lower(): models.ForeignKey(\n            to=cls, on_delete=models.CASCADE\n        ),\n        \"__module__\": cls.__module__\n    }\n\n    cls.add_to_class(\n        \"inventory_variables\", models.ManyToManyField(\n            to=Argument,\n            through=type(\n                f\"{cls.__name__}Argument\", (ArgumentThrough,), through_cls_dict\n            ),\n            blank=True,\n        )\n    )\n\n\nfor model in (Host, Group):\n    add_related_field__argument(model)\n\n</code></pre>\n<p>\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u5c31\u53ef\u4ee5\u4e0d\u7528\u5199\u201c\u91cd\u590d\u201d\u7684\u4ee3\u7801\u4e86\u3002<br/>\n\u4e0d\u77e5\u9053\u4f60\u4eec\u662f\u600e\u4e48\u89e3\u51b3\u8fd9\u7c7b\u95ee\u9898\u7684\uff0c\u5e0c\u671b\u6211\u80fd\u629b\u7816\u5f15\u7389\u3002</p>\n"
    }, 
    {
      "author": {
        "url": "https://www.v2ex.com/member/dearmymy", 
        "name": "dearmymy", 
        "avatar": "https://cdn.v2ex.com/gravatar/db518e469d91f54ee805c2069e84e819?s=73&d=retro"
      }, 
      "url": "https://www.v2ex.com/t/803806", 
      "title": "\u54a8\u8be2\u4e2a django \u5904\u7406\u8017\u65f6\u4efb\u52a1\u7684\u95ee\u9898\uff0c\u987a\u4fbf\u627e\u4e2a\u517c\u804c\u5b8c\u6210\u4e2a demo", 
      "id": "https://www.v2ex.com/t/803806", 
      "date_published": "2021-09-24T01:22:37+00:00", 
      "content_html": "<p>\u65b0\u624b django \u3002\n\u73b0\u5728\u60c5\u51b5\u8fd9\u6837\uff0c\u7528\u6237\u524d\u7aef\u70b9\u51fb\u6309\u94ae\uff0c\u540e\u53f0\u6536\u5230\u8bf7\u6c42\u4f1a\u8fdb\u884c\u4e00\u4e2a\u957f\u65f6\u95f4\u7684\u64cd\u4f5c\uff08 5 \u5206\u949f\u5de6\u53f3\uff09\u3002\u4e2d\u95f4\u8fd8\u8981\u8fd4\u56de\u5b8c\u6210\u8fdb\u5ea6\u3002\n\u6211\u770b\u8bf4\u5f02\u6b65\u64cd\u4f5c\u7528 celery \u3002\u4f46\u662f\u90a3\u4e2a worker \u8c8c\u4f3c\u4e0d\u80fd\u592a\u591a\u3002\u6bd4\u5982\u53ea\u6709\u56db\u4e2a worker\uff0c\u662f\u4e0d\u662f\u8d85\u8fc7\u56db\u4e2a\u8bf7\u6c42\u518d\u8fdb\u6765\u7684\u4e5f\u5f97\u6392\u961f\u3002\n\u8fd9\u79cd\u662f\u4e0d\u662f\u5f97\u7528\u7ebf\u7a0b\u64cd\u4f5c\u3002\u81ea\u5df1\u5b9e\u73b0\u7c7b\u4f3c celery \u7684\u6837\u5b50\uff0c\u5f00\u542f\u4e00\u4e2a\u7ebf\u7a0b\u65f6\u5019\u751f\u6210\u4e00\u4e2a\u552f\u4e00 id\uff0c\u53cd\u7ed9\u524d\u7aef\uff0c\u7ebf\u7a0b\u6839\u636e\u8fd9\u4e2a id \u628a\u4e2d\u95f4\u6b65\u9aa4\u5b8c\u6210\u60c5\u51b5\u653e\u5230 redis \u3002\u524d\u7aef\u901a\u8fc7\u8fd9\u4e2a id \u53bb\u67e5\u627e\u5b8c\u6210\u72b6\u6001\u3002\n\u6709\u6ca1\u6709\u66f4\u9002\u5408\u7684\u89e3\u51b3\u65b9\u6cd5\u3002\n\u8fd9\u4e2a\u5c0f\u9879\u76ee\u662f\u4e2a\u5185\u90e8\u6f14\u793a demo \u3002\u5982\u679c\u6709\u8001 django \u670b\u53cb\u6709\u65f6\u95f4\uff0c\u53ef\u4ee5\u7559\u4e0b\u8054\u7cfb\u65b9\u5f0f\uff0c\u5916\u5305\u51fa\u53bb\u3002\u9879\u76ee\u4e0d\u5bf9\u5916\u53ea\u662f\u5bf9\u9886\u5bfc\u6f14\u793a\u529f\u80fd\u3002</p>\n"
    }
  ]
}