簡體   English   中英

Django Rest Framework 只讀字段問題

[英]Django Rest Framework Read-Only Field Issue

我正在學習 DRF,但遇到了一個問題。 我在模型中有 slug 字段,我想從標題中對其進行 slugified。 問題是我無法以任何方式完成此自動填充。 我在模型中創建了自定義保存方法,如下所示:

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 給出 false

這是我得到的錯誤

任何幫助表示贊賞! 謝謝

不知道為什么它讓你失望。 剛試過這個簡單的例子

# 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()

並為我工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM