首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NOT NULL约束失败: snippets_choice.post_id

NOT NULL约束失败: snippets_choice.post_id
EN

Stack Overflow用户
提问于 2019-10-15 08:22:50
回答 1查看 945关注 0票数 0

我试图在这里使用POST方法,但它抛出了一个错误。

这是Models.py:

代码语言:javascript
复制
from django.db import models

class Post(models.Model):
    post_text=models.CharField(max_length=200)

    def __str__(self):
        return self.post_text

class Choice(models.Model):
    post=models.ForeignKey(Post, on_delete=models.CASCADE)
    choice_text=models.CharField(max_length=200)
    likes=models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

这是serializes.py:

代码语言:javascript
复制
from rest_framework import serializers
from snippets.models import Post, Choice

class PostSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model=Post
        fields=['id','post_text']

class ChoiceSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model=Choice
        fields=['id','choice_text','likes']

这是views.py:

代码语言:javascript
复制
from django.shortcuts import render
from rest_framework import generics
from rest_framework.reverse import reverse
from .models import Choice, Post
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from snippets.serializers import ChoiceSerializer, PostSerializer

class PostList(generics.ListCreateAPIView):
    queryset=Post.objects.all()
    serializer_class=PostSerializer
    name='post-list'

class PostDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset=Post.objects.all()
    serializer_class=PostSerializer
    name='post-detail'

class ChoiceList(generics.ListCreateAPIView):
    queryset=Choice.objects.all()
    serializer_class=ChoiceSerializer
    name='choice-list'

class ChoiceDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset=Choice.objects.all()
    serializer_class=ChoiceSerializer
    name='choice-detail'

class ApiRoot(generics.GenericAPIView):
    name='api-root'

    def get(self, request, *args, **kwargs):
        return Response({
        'posts': reverse(PostList.name, request=request),
        'choices': reverse(ChoiceList.name, request=request),
        }) 

urls.py:

代码语言:javascript
复制
urlpatterns=[
    path('post-list/', views.PostList.as_view(), name='post-list'),
    path('post-list/<int:pk>/', views.PostDetail.as_view()),
    path('choice-list/', views.ChoiceList.as_view(), name='choice-list'),
    path('choice-list/<int:pk>/', views.ChoiceDetail.as_view()),
    path('',views.ApiRoot.as_view(),name=views.ApiRoot.name),
]

当我尝试发帖时:

代码语言:javascript
复制
{ 
    "id":3
    "choice_text": "random text",
    "likes": 0
}

我得到了这个错误:

代码语言:javascript
复制
IntegrityError at /choice-list/
NOT NULL constraint failed: snippets_choice.post_id

如果我提供了id,为什么会抛出一个错误?

即使在Postman中,它也要求我输入' choice_text ',即使我提供了choice_text。

EN

回答 1

Stack Overflow用户

发布于 2019-10-15 09:13:12

您正在尝试创建一个选项,并且choice模型与具有not null约束的Post模型相关,因此请将post外键设置为null

post=models.ForeignKey(Post, on_delete=models.CASCADE)

post=models.ForeignKey(Post, on_delete=models.CASCADE, null=True)

或者您必须首先创建帖子,然后在创建选项时传递帖子id。

POST请求到/post-list/

代码语言:javascript
复制
{
   "post_text": "Hello World!"
}

它将创建一个带有帖子id的帖子,假设post_id =1

POST请求到/choice-list/

代码语言:javascript
复制
{ 
    "choice_text": "random text",
    "likes": 0,
    "post": 1
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58385606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档