django.db.utils.IntegrityError:NOT NULL约束失败-drf_writable_nested

时间:2019-03-06 07:49:30

标签: python django django-rest-framework

创建了一个简单的应用程序,可让我创建客户端,然后将功能列表添加为字段(具有多个选项)。

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')

python shell

>>> 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 :(得分:0)

正如我在评论中所写,您在对文档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关系。