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



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

class Province(models.Model):
name = models.CharField(max_length=30)
code = models.CharField(max_length=10)
@property
def slug(self):
return slugify(self.name)

我的网址:

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的情况下解决这个问题?

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

问题是,您现在无法在slug的数据库端进行过滤,因为它不存在,属性只存在于Django/Python级别。

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

如果不想实现指定段塞的方法,可以使用django-autoslug包中的AutoSlugField字段。你用安装这个

pip3 installdjango-autoslug

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

from autoslug importAutoSlugField
from django.db import models
class Province(models.Model):
name = models.CharField(max_length=30)
code = models.CharField(max_length=10)
slug =AutoSlugField(populate_from='name')

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

最新更新