【发布时间】:2021-03-06 06:21:28
【问题描述】:
我正在学习 DRF,但遇到了一个问题。我想从标题中删除模型中的 slug 字段。问题是无论我尝试什么方式,我都无法完成这个自动填充。我在模型中创建了自定义保存方法,如下所示:
class PostObjects(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status="published")
class Post(models.Model):
options = (("draft", "Draft"), ("published", "Published"))
category = models.ForeignKey(Category, on_delete=models.PROTECT, default=1)
title = models.CharField(max_length=250)
excerpt = models.TextField(null=True)
content = models.TextField()
slug = models.SlugField(max_length=250, unique_for_date="published")
published = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(
get_user_model(), on_delete=models.CASCADE, related_name="blog_posts"
)
status = models.CharField(max_length=10, choices=options, default="published")
objects = models.Manager()
postobjects = PostObjects()
class Meta:
ordering = ("-published",)
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super().save(*args, **kwargs)
def __str__(self):
return self.title
然后我尝试在 Serializer.py 中通过几种方式使该字段只读:
class PostSerializer(serializers.ModelSerializer):
slug = serializers.ReadOnlyField()
class Meta:
model = Post
fields = ("id", "title", "author", "excerpt", "content", "status", "slug")
#read_only_fields = ["slug"]
#extra_kwargs = {'slug': {'read_only': True}}
所有三种方式(ReadOnlyField、read_only_fields、extra_kwargs)都会给我错误,即需要 slug。我还尝试在视图中创建自定义“perform_create”,这样我就可以将这个 slugify 提供给 .save 方法但再次没有结果,因为 is.valid 给出了错误
任何帮助表示赞赏! 谢谢
【问题讨论】:
-
嗨,为了确定,你能发布你得到的错误吗?你是在写 UT 来说明问题吗?
-
@MassimoCosta 你好,我添加了一个有错误的截图。对不起,我不明白你所说的 UT 是什么意思
-
UT(单元测试)对不起我太短了:D
-
不确定
ReadOnlyField(),文档说它是自动生成的。在您的注释代码中有一个类型。它应该是read_only_fields而不是read_only_field -
实际上是 read_only_fields。评论是我粗心大意。
标签: python django rest serialization slug