【问题标题】:how to create auto slugfield in ddjango restframework in django like如何在 django 的 django rest 框架中创建自动 slug 字段,例如
【发布时间】:2021-10-05 02:22:29
【问题描述】:
class AddCategory(admin.ModelAdmin):
list_display = ['name', 'slug']
prepopulated_fields = {'slug': ('name',)}
类 CategorySerializer(serializers.ModelSerializer):
元类:
型号 = 类别
字段 = ['name', 'slug', 'icon']
lookup_field = '蛞蝓'
【问题讨论】:
标签:
django
django-rest-framework
【解决方案1】:
您可以在model 内的save 方法中手动实现
-
创建custom_slugify 方法:
def custom_slugify(slug):
slug = slug.replace(" ", "-")
slug = slug.replace(",", "-")
slug = slug.replace("(", "-")
slug = slug.replace(")", "")
slug = slug.replace("؟", "")
return slug
-
调用save方法
def save(self, *args, **kwargs):
self.slug = custom_slugify(self.name)
super().save(*args, **kwargs)
【解决方案2】:
from django.utils.text import slugify
class Category(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(max_length=120)
def save(self, *args, **kwargs):
if not self.pk:
self.slug = slugify(self.name)
super().save(*args, **kwargs)
覆盖您的保存方法以自动生成您的 slug。
【解决方案3】:
我正在寻找同样的东西。我的模型上有这个,想把它移到我的序列化器创建方法中。我知道您在问如何使用 DRF 进行操作,但我不确定是否最好将其保留在模型本身上,以防您必须在管理员或类似工具中手动更新。
from django.db.models.signals import pre_save
from django.utils.text import slugify
class Software(models.Model):
name = models.CharField(max_length=200, unique=True, verbose_name='Software Name')
slug = models.SlugField(unique=True, null=True)
status = models.BooleanField(default=False, verbose_name='Active')
class Meta:
verbose_name = ('Software')
verbose_name_plural = ('Software')
ordering = ["id", "name"]
def __str__(self):
return self.name
def pre_save_software(sender, instance, *args, **kwargs):
slug = slugify(instance.name)
instance.slug = slug
pre_save.connect(pre_save_software, sender=Software)