问题描述
问题是,我无法像您在tests.py中看到的那样发布字段“author”,并返回错误"{'author': [ErrorDetail(string='Invalid pk "1" - 对象不存在。',code='does_not_exist')]}"见下面的附图。
这是运行测试时的错误 coverage run --omit='/venv/' manage.py test
这是我在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
解决方法
我尝试评论其他测试,结果只运行了 one(1) 个测试,并且还使用了 "$ ./manage.py test" 而不是 "覆盖运行 --omit='/venv/' manage.py test" 对我有用。
如果有人知道为什么会发生这种情况,请随时在下方发表/评论。