创建了一个简单的应用程序,可让我创建客户端,然后将功能列表添加为字段(具有多个选项)。
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')
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包。
答案 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
关系。