使用基于@propert 的attr 作为Model slug,django 的观点?

Use @propert based attr as Model slug, django's views?

我正在尝试使用我的模型中使用 @property 装饰器创建的属性作为 django DetailsView 的 slug 字段,如下所示:

class Province(models.Model):
    name = models.CharField(max_length=30)
    code = models.CharField(max_length=10)

    @property
    def slug(self):
        return slugify(self.name)

我的url:

path("map/<slug:slug>", MyView.as_view())

我的看法:

class MyView(DetailView):
    template_name="myapp/map.html"
    context_object_name = "province"
    model = Province

但是在访问页面时出现以下异常:

Cannot resolve keyword 'slug' into field. Choices are: code, id, name

有没有办法解决这个问题,而不使用显式 SlugField

简短回答:您不能将 slug 存储为 @property,因为它不会存储在数据库中。

问题是你现在不能在数据库端过滤 slug,因为那里不存在,属性 只存在于 Django/Python 级别。

因此,一个 slug 应该存储在数据库中。 DetailView 将进行查询,在 数据库 端查找具有给定 slug 的记录。 SlugField或其子类之一,通常会在字段上添加db_index=True,因此数据库会建立索引以有效地查找记录。

如果你不想实现指定 slug 的方法,你可以使用 AutoSlugField field, from django-autoslug 包。你安装这个:

pip3 install <b>django-autoslug</b>

在您的虚拟环境中。接下来,您可以添加此字段:

from autoslug import <b>AutoSlugField</b>
from django.db import models

class Province(models.Model):
    name = models.CharField(max_length=30)
    code = models.CharField(max_length=10)
    slug = <b>AutoSlugField(populate_from='name')</b>

这不是一个好的解决方案,在您的模型中您没有 SlugField 并且您没有在数据库中存储 slug。所以你不能查询 属性 - 这就是它不起作用的原因。