【问题标题】:Unable to Post data using Django REST Framework无法使用 Django REST 框架发布数据
【发布时间】:2017-05-24 12:20:02
【问题描述】:

我得到这个error 虽然我在文本和标题字段中给出了正确的字符串。我不知道是什么原因,但是我能够发布剩余三个字段的值(作者、创建日期、发布日期)。

序列化器.py

from rest_framework import serializers
from blog.models import Post
from django.utils import timezone
from rest_framework.validators import UniqueValidator

class blogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('author','title', 'text','created_date','published_date')

模型.py

from django.db import models
from django.utils import timezone

class Post(models.Model):
   author = models.ForeignKey('auth.User',null=True)
   title = models.CharField(max_length=200)
   text = models.CharField(max_length=200)
   created_date = models.DateTimeField(
        default=timezone.now)
   published_date = models.DateTimeField(
        blank=True,null=True)

   def publish(self):
       self.published_date = timezone.now()
       self.save()

   def __str__(self):
       return self.title

views.py

from blog.models import Post
from .serializers import UserSerializer, GroupSerializer,blogSerializer
from rest_framework import viewsets,status
from rest_framework.decorators import api_view

class blogViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = blogSerializer

我在这里发布数据。

    @api_view(['GET', 'POST'])
    def blog_list(request):
       if request.method=='GET':
           my_blog=Post.objects.all()
           serializers=blogSerializer(my_blog,Many=True)
           return JsoResponse(serializers.data,safe=False)

       elif request.method=='POST':
           data=JSONParser().parse(request)
           serializers=blogSerializer(data=data)
           if serializers.is_valid():
              serializer.save()
              return JsonResponse(serializers.data,status=201)
           return JsonResponse(serializers.errors,status=400)

【问题讨论】:

  • 您收到错误消息,因为文本和标题是必需的并且为空。如果您希望它们是可选的,请将 blank=True, null=True 添加到模型中。
  • @Razzildinho 他声称他为这两个字段提供了正确的字符串。
  • 不,我在这两个字段中给出了正确的字符串,但仍然抛出相同的错误。
  • 您是否仅使用可浏览的 API 进行了尝试?如果您在 shell 中尝试这样做会发生什么,例如:curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" -d '{"title": "Some title", "text": "Some text"}' http://localhost:8000。如果需要更改http://localhost:8000
  • 我建议覆盖 create 函数(或事件 post 函数)并打印调试消息。例如打印 request.data

标签: python django django-models django-rest-framework


【解决方案1】:

我会设置一个单元测试来测试这个功能。看起来您的任何帖子数据都没有进入序列化程序,否则一旦您提交表单并且返回错误的 for 就会重新填充有效字段。标题和文本字段也是唯一需要/没有默认值的字段。

如果您在访问request.data 的视图上使用某种形式的装饰器(或类似的东西),这可能是导致问题的原因。由于rest框架在填充request.data时修改了request.POST

【讨论】:

  • 其他三个字段(作者、创建日期、发布日期)的数据正在进入序列化器。
  • 你是如何测试的?在您的屏幕截图中,显示表单错误是因为表单已提交且验证失败。如果仅对文本和标题进行验证失败,则其他字段仍将包含您最初提交表单时输入的数据。由于作者可以为空并且日期字段具有指定的默认值,因此您没有看到其他字段的必需错误
  • 我会在视图集的 create 方法中放置一个 pdb 语句并查看 request.data 内容
猜你喜欢
  • 2014-09-21
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2017-12-25
  • 1970-01-01
  • 2019-12-29
相关资源
最近更新 更多