Как установить пользовательское значение для поля модели в django RetrieveUpdateDestroyAPIView?
У меня есть этот класс RetrieveUpdateDestroyAPIView в моих api представлениях и при обновлении он не обновляет автоматически поле данных с именем published. Я хочу обновлять вручную, когда отправляется PUT запрос. Как я могу это сделать. Вот код
models.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
view.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, который вы хотите обновить, а затем убедитесь, что вы отправляете пару 'published' ключ: значение в полезной нагрузке при submit.
Что-то вроде этого:
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)
Пример запроса PUT:
{
"id": 123,
"title": "New Post Title",
"published": <required-date-format-for-your-project>
}