每当我试图创建一个帖子时,我总是得到这个错误。我已经在这个平台上经历了所有类似的问题,并进行了几次调整,但错误仍然发生。
IntegrityError at /API/admin/create/ NOT NULL constraint failed:blog_post.author_id请求方法:POST请求URL:http://127.0.0.1:8000/api/admin/create/
下面是我的用户模型:
class NewUser(PermissionsMixin, AbstractBaseUser):
email = models.EmailField(_('email_address'), unique=True)
user_name = models.CharField(max_length=150, unique=True)
first_name= models.CharField(max_length=150, blank=True)
about = models.TextField(_('about'), max_length=500, blank=True)
start_date = models.DateTimeField(default=timezone.now)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=True)
objects = CustomAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'user_name']
下面是我的custome用户模型的自定义管理器:
class CustomAccountManager(BaseUserManager):
def create_superuser(self, email, user_name, first_name, password, **other_fields):
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_active', True)
if other_fields.get('is_superuser') is not True:
raise ValueError('superuser must be assigned to is_superuser=True')
if other_fields.get('is_staff') is not True:
raise ValueError('superuser must be assigned to is_staff=True')
user = self.create_user(email, user_name, first_name, password, **other_fields)
user.save(using=self._db)
return user
def create_user(self, email, user_name, first_name, password, **other_fields):
if not email:
raise ValueError(_('You must provide an email address'))
email = self.normalize_email(email)
user = self.model(email=email, user_name=user_name, first_name=first_name, **other_fields)
user.set_password(password)
user.save()
return user
下面是我的custome用户模型的序列化器类:
class RegisterUserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=True)
username = serializers.CharField(required=True)
password = serializers.CharField(min_length=8, write_only=True)
class Meta:
model = NewUser
fields = ('email', 'user_name', 'password', 'first_name')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
下面是我的观点:
class CustomUserCreate(APIView):
permission_classes = [AllowAny]
def post(self, request, format='json'):
reg_serializer = RegisterUserSerializer(data=request.data)
if reg_serializer.is_valid():
newuser = reg_serializer.save()
if newuser:
json = reg_serializer.data
return Response(json, status= status.HTTP_201_CREATED)
return Response(reg_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
以下是端点“www.example.com”连接到的post视图http://127.0.0.1:8000/api/admin/create/:
class CreatePost(generics.CreateAPIView):
permission_classes = [permissions.IsAuthenticated]
queryset = Post.objects.all()
serializer_class = PostSerializer
首次编辑:以下是帖子模型:
class Post(models.Model):
class PostObjects(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status = 'published')
options = (
('draft', 'Draft'),
('published', 'Published')
)
post_id = models.BigAutoField(primary_key=True)
category = models.ForeignKey(Category, on_delete=models.PROTECT, default=1, related_name="postcategory")
title = models.CharField(max_length=250)
excerpt = models.TextField(null=True)
photo = models.ImageField(_("image"), upload_to=upload_to, default='posts/default.jpg')
content = models.TextField()
slug = models.SlugField(max_length=250, unique_for_date='published')
published = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(settings.AUTH_USER_MODEL, 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
第二次编辑:下面是我在设置文件中的设置:
自定义用户模型
AUTH_USER_MODEL = "users.NewUser"
第三次编辑:这是我用来创建帖子的视图和序列化器:
查看
class CreatePost(generics.CreateAPIView):
permission_classes = [permissions.IsAuthenticated]
queryset = Post.objects.all()
serializer_class = PostSerializer
串行化器:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('post_id', 'category', 'title', 'author', 'content', 'excerpt', 'slug', 'status', 'photo')
2条答案
按热度按时间piwo6bdm1#
你能在你的数据中添加Post Model吗?也许我能帮上忙如果我看到它
gupuwyp22#
Post模型需要一个用户作为作者,但没有传递任何作者。这将导致“NOT NULL约束失败:blog_post.author_id”错误,因为author_id不能为null。要解决这个问题,请提供您用来创建帖子的视图和序列化程序。这将允许我演示如何将当前用户或发出请求的用户指定为作者(假设这是您的意图)。
编辑:
重写序列化程序的create方法,将作者设置为请求用户: