Django Rest Framework POST 失败:“cat_id”列中的空值违反了非空约束

cur*_*dev 5 python django python-3.x django-class-based-views django-rest-framework

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

模型.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',)
Run Code Online (Sandbox Code Playgroud)

序列化器.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')
Run Code Online (Sandbox Code Playgroud)

视图.py

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

urls.py

path('tasks/', views.TaskList.as_view()),
Run Code Online (Sandbox Code Playgroud)

返回错误

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

请求内容:JSON 对象

{
    "name": "buy-some",
    "cat_id": 1
}
Run Code Online (Sandbox Code Playgroud)

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

存在 id=1 的类别

ivi*_*ani 3

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

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

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

{
    "name": "buy-some",
    "cat": 1
}
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题。