django.db.utils.IntegrityError: Сбой ограничения NOT NULL - drf_writable_nested - PullRequest
0 голосов
/ 06 марта 2019

Создано простое приложение, которое позволяет мне создавать клиентов, а также добавлять список функций в виде поля (с несколькими параметрами).

models.py

from django.db import models


class Feature(models.Model):
    feature1 = models.BooleanField(default=None)
    feature2 = models.BooleanField(default=None)
    feature3 = models.BooleanField(default=None)

class Client(models.Model):
    client_name = models.CharField(max_length=200)
    org_id = models.CharField(max_length=100)
    date_created = models.CharField(max_length=100)
    features = models.ManyToManyField(Feature, related_name='client_list')

serializers.py

from rest_framework import serializers
from .models import Client, Feature
from drf_writable_nested import WritableNestedModelSerializer

class featureSerializer(serializers.ModelSerializer):
    class Meta:
        model = Feature
        fields = ('feature1', 'feature2', 'feature3')

class clientSerializer(WritableNestedModelSerializer):
    features = featureSerializer(many=True)
    class Meta:
        model = Client
        fields = ('id', 'client_name', 'org_id', 'date_created', 'features')

оболочка питона

>>> data = {'client_name': 'Test Client XYZ', 'org_id': '001', 'date_created': '2018-03-06', 'features': [{'feature1': True}, {'feature2': False}, {'Feature3': True},],}
>>> serializer = clientSerializer(data=data)
>>> serializer.is_valid()
True
>>> print(serializer)
clientSerializer(data={'client_name': 'Test Client XYZ', 'org_id': '001', 'date_created': '2018-03-06', 'features': [{'feature1': True}, {'feature2': False}, {'feature3': True}]}):
    id = IntegerField(label='ID', read_only=True)
    client_name = CharField(max_length=200)
    org_id = CharField(max_length=100)
    date_created = CharField(max_length=100)
    features = featureSerializer(many=True):
        feature1 = BooleanField(required=False)
        feature2 = BooleanField(required=False)
        feature3 = BooleanField(required=False)
>>> print(serializer.data)
{'client_name': 'Test Client XYZ', 'org_id': '001', 'date_created': '2018-03-06', 'features': [OrderedDict([('feature1', True)]), OrderedDict([('feature2', False)]), OrderedDict([('feature3', True)])]}

но когда я на самом деле иду сохранить, используя:

>>> client = serializer.save()

Я получаю следующую ошибку:

django.db.utils.IntegrityError: NOT NULL constraint failed: client_feature.feature2

Понятия не имею, почему это не экономит. Кажется, что он генерирует ошибку на Feature2, для которой я передал значение False. Любая помощь будет принята с благодарностью. Первоначально я собирался использовать DRF API для создания данных, но понял, что он не поддерживает списки, поэтому я не смог войти в функциональную часть клиента. Вот почему я использовал пакет drf_writable_nested.

1 Ответ

0 голосов
/ 06 марта 2019

Как я уже писал в своем комментарии, вы делаете ошибку в отношении документа https://github.com/beda-software/drf-writable-nested и вашей концепции.

Здесь у вас есть класс с тремя полями:

class Feature(models.Model):
    feature1 = models.BooleanField(default=None)
    feature2 = models.BooleanField(default=None)
    feature3 = models.BooleanField(default=None)

Итак, когда вы выполняли свою реализацию, вы создавали один объект с набором Feature1, но не Feature2 или Feature3, а затем с набором Feature2, но не Feature1, не Feature3 и т. Д ...

Вот почему яЯ уверен, что в вашем случае вам не нужен список, поскольку в вашем объекте есть все функции.

В приведенном вами примере просто объявляется несколько сайтов.Например, у вас было:

class Feature(models.Model):
    name = models.CharField(max_size=255)

Вы могли бы сделать: 'features': [{'name': 'feature1'}, {'name': 'feature2'}, {'name': 'feature3'}...]

Важно, что вы это понимаете.

Здесь, я даже не знаюесли вам нужно отношение ManyToMany.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...