【问题标题】:django.db.utils.IntegrityError: NOT NULL constraint failed - drf_writable_nesteddjango.db.utils.IntegrityError: NOT NULL 约束失败 - drf_writable_nested
【发布时间】:2019-03-06 07:49:29
【问题描述】:

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

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 外壳

>>> 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 包的原因。

【问题讨论】:

  • 当你设置你的特性时,你能把所有的都放在同一个字典里吗?喜欢[{'feature1': True, 'feature2': False, 'feature3': True}]。看起来您正在设置 3 个要素对象。我不明白你为什么需要一个列表。
  • 是的!有效!我正在关注 drf_writable_nested (github.com/beda-software/drf-writable-nested) 的文档,他们将其格式化为每个项目的字典......很奇怪。
  • 嗯,我很确定他们没有相同的班级。

标签: python django django-rest-framework


【解决方案1】:

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

【讨论】:

  • 我的目标是最终创建一个表单,在该表单中有人可以创建客户端,并且会在提交时添加到客户端对象中的 10 个功能列表(全部为布尔值)。仅使用名称和布尔字段创建要素类,然后在前端更改名称多次调用它会更容易吗?
  • 此外,所有功能都是预定义的,用户不会创建自定义功能。
猜你喜欢
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 2016-04-07
  • 2015-04-22
相关资源
最近更新 更多