【问题标题】:Django Rest Framework Read-Only Field IssueDjango Rest Framework 只读字段问题
【发布时间】: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


【解决方案1】:

不知道为什么它对你不利。 刚刚尝试了这个简单的例子

# models.py
from django.db import models
from django.utils.text import slugify


# Create your models here.
class MyModel(models.Model):

    title = models.TextField()
    slug = models.SlugField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)
# serializers.py
from rest_framework import serializers

from .models import MyModel


class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        read_only_fields = ('slug', )
        fields = '__all__'
# views.py
from rest_framework import generics

from .models import MyModel
from .serializers import MyModelSerializer

# Create your views here.
class MyView(generics.CreateAPIView):

    serializer_class = MyModelSerializer
    queryset = MyModel.objects.all()

为我工作

【讨论】:

  • 好吧,我想我明白是什么原因了。 SlugField 中的“unique_for_date”属性造成了问题。我删除了它,它运行良好。非常感谢您的帮助。我知道 DRF 网站中提到了关于“unique_together”的限制,但没有提到“unique_for_date”
猜你喜欢
  • 2017-08-29
  • 2018-05-17
  • 2019-04-01
  • 2021-09-03
  • 2013-01-15
  • 2021-11-18
  • 2016-05-01
  • 2013-02-01
  • 2014-08-19
相关资源
最近更新 更多