Problem is, I can't post the field "author" as you can see in the tests.py, and returns an error "{'author': [ErrorDetail(string='Invalid pk "1" - object does not exist.', code='does_not_exist')]}" see attached photo below.
This is the error when running the test coverage run --omit='/venv/' manage.py test
This is my code inside my 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')
Here's the 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