python - 如何在 django RetrieveUpdateDestroyAPIView 中为模型字段设置自定义值?
问题描述
我的 api 视图中有这个 RetrieveUpdateDestroyAPIView 类,更新时它不会自动更新名为published的数据字段。我想在发送 PUT 请求时手动更新。我怎样才能做到这一点。这是代码
模型.py
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Post(models.Model):
class PostObjects(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='published')
options = (
('published', 'Published'),
('draft', 'Draft')
)
category = models.ForeignKey(Category, on_delete=models.PROTECT, default=1)
title = models.CharField(max_length=100)
excerpt = models.TextField(null=True)
content = models.TextField()
slug = models.SlugField(max_length=250, unique_for_date=True)
published = models.DateField(null=True, default=timezone.now)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='blog_posts', default=1)
status = models.CharField(
max_length=10, choices=options, default='published')
objects = models.Manager()
postobjects = PostObjects()
class Meta:
ordering = ('-published',)
def __str__(self):
return self.title
视图.py
from rest_framework import generics
from blog.models import Post
from .serializers import PostSerializer
class PostList(generics.ListCreateAPIView):
queryset = Post.postobjects.all()
serializer_class = PostSerializer
class PostDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
解决方案
在 PostDetail 上,不要设置queryset
属性,而是覆盖get_object
方法以查找要更新的特定 POST 实例,然后确保在提交时在有效负载中发送“已发布”键:值对。
像这样的东西:
class PostDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = PostSerializer
def get_object(self):
_id = self.request.data.get('id')
return get_object_or_404(Post, pk=_id)
样品放置请求:
{
"id": 123,
"title": "New Post Title",
"published": <required-date-format-for-your-project>
}
推荐阅读
- laravel-echo - 带有 Pusher 和 laravel-websockets 的 Laravel 广播不发送消息
- c# - 如何从 VBA 和 Excel 调用 C# 函数
- performance - 更改后无法保存 Jenkins 作业,没有可见错误
- java - 从 AudioRecord.read 读取的缓冲区只包含零
- python - Python 一个线性 lambda 函数 - 如果它在另一组字符中,则过滤字符数组返回字符
- php - Wordpress Ajax 函数返回未指定的错误
- algorithm - 我可以确定地求和任意排列的浮点数的向量吗?
- javascript - window.location.replace() - 无法按预期工作
- libcurl - 使用 Bazel 使用 SSL 密封构建 libcurl?
- symfony - 我们可以存储来自两个来源的 OneToMany 关系吗?