POST Django Rest Framework завершается с ошибкой: нулевое значение в столбце "cat_id" нарушает ненулевое ограничение - PullRequest
0 голосов
/ 15 ноября 2018

Я недавно преобразовал свои представления в общие представления на основе классов, однако я только что заметил, что запросы 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 Object

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

Кроме того, Content-Type, Accept заголовки установлены в application / json .

Категория с идентификатором = 1 существует

1 Ответ

0 голосов
/ 15 ноября 2018

Вероятно, вам нужно определить поле cat в вашем TaskSerializer как PrimaryKeyRelatedField (документация здесь) , в вашем случае это будет:

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

Тогда в вашем запросе просто отправьте ПК в поле "cat" следующим образом:

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

Это должно сработать.

...