在 django-rest-framework 中测试自定义权限预期为 201 但为 400

时间:2021-06-18 09:10:32

标签: django-rest-framework django-permissions

问题是,我无法像您在tests.py中看到的那样发布字段“author”,并返回错误"{'author': [ErrorDetail(string='Invalid pk "1" - 对象不存在。', code='does_not_exist')]}"见下面的附图。

这是运行测试时的错误 coverage run --omit='/venv/' manage.py test

Error

这是我在tests.py中的代码

    def test_create_post(self):
    """
    Ensure we can create a new Post object and view object.
    """
    self.test_category = Category.objects.create(name='django')
    self.testuser1 = User.objects.create_superuser(
        username='test_user1', password='123456789')
    # self.testuser1.is_staff = True

    self.client.login(username=self.testuser1.username,
                      password='123456789')

    data = {"title": "new", "author": 1, "excerpt": "new", "content": "new"}
    url = reverse('blog_api:listcreate')
    response = self.client.post(url, data, format='json')
    print(response.data)
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)

views.py

class PostList(generics.ListCreateAPIView):
   permission_classes = [IsAuthenticatedOrReadOnly]
   queryset = Post.postobjects.all()
   serializer_class = PostSerializer

serializers.py

class PostSerializer(serializers.ModelSerializer):

class Meta:
    model = Post
    fields = ('id', 'title', 'author', 'excerpt', 'content', 'status')

这是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 = (
    ('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(
    User, on_delete=models.CASCADE, related_name='blog_posts')
status = models.CharField(
    max_length=10, choices=options, default='published')
objects = models.Manager()  # default manager
postobjects = PostObjects()  # custom manager

class Meta:
    ordering = ('-published',)

def __str__(self):
    return self.title

1 个答案:

答案 0 :(得分:0)

我尝试评论其他测试,结果只运行了 one(1) 个测试,并且还使用了 "$ ./manage.py test" 而不是 "覆盖运行 --omit='/venv/' manage.py test" 对我有用。

如果有人知道为什么会发生这种情况,请随时在下方发表/评论。

相关问题