【问题标题】:Django Rest Framework POST fails: null value in column "cat_id" violates not-null constraintDjango Rest Framework POST 失败:“cat_id”列中的空值违反非空约束
【发布时间】:2019-04-17 22:38:46
【问题描述】:

我最近将我的视图转换为基于类的通用视图,但是我刚刚注意到 POST 请求在具有外键的类上失败。以下是我的代码,后面是错误信息。

models.py

class Category(models.Model):
    name = models.CharField(max_length=25, blank=False)

    class Meta:
        ordering = ('id',)


class Task(models.Model):
    name = models.CharField(max_length=25, blank=False)
    cat = models.ForeignKey(Category, on_delete=models.CASCADE)

    class Meta:
        ordering = ('id',)

serializers.py

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ('id', 'name', 'cat_id')


class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('id', 'name')

views.py

class TaskList(generics.ListCreateAPIView):
    """
    List all Tasks (OR for specified cat_id)
    """
    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    filter_fields = ('cat_id',)

urls.py

path('tasks/', views.TaskList.as_view()),

错误返回

django.db.utils.IntegrityError: null value in column "cat_id" violates not-null constraint
DETAIL:  Failing row contains (51, buy-some, null).

请求内容:JSON 对象

{
    "name": "buy-some",
    "cat_id": 1
}

此外,Content-Type, Accept 标头设置为 application/json

存在 id=1 的类别

【问题讨论】:

    标签: python django python-3.x django-rest-framework django-class-based-views


    【解决方案1】:

    您可能想要将TaskSerializer 中的字段cat 定义为PrimaryKeyRelatedField(documentation here),在您的情况下是:

    class TaskSerializer(serializers.ModelSerializer):
        cat = PrimaryKeyRelatedField(queryset=Category.objects.all())
        class Meta:
            model = Task
            fields = ('id', 'name', 'cat')
    

    然后在您的请求中,只需在 "cat" 字段中发送 pk,如下所示:

    {
        "name": "buy-some",
        "cat": 1
    }
    

    这应该可以解决问题。

    【讨论】:

    • 确保在它之前添加“序列化程序”:cat = serializers.PrimaryKeyRelatedField(queryset=Category.objects.all())
    • @Sharpless512 我不确定你的意思是什么?你是说你需要从serializers而不是relations导入?当我浏览源代码时,它看起来像 serializers 只是从 relations 导入,所以仍然只有一个 PrimaryKeyRelatedField 类。
    猜你喜欢
    • 2020-11-28
    • 2019-04-08
    • 2017-10-15
    • 2018-09-12
    • 2018-05-28
    • 2021-03-30
    • 2021-09-27
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多