【发布时间】: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