Создано простое приложение, которое позволяет мне создавать клиентов, а также добавлять список функций в виде поля (с несколькими параметрами).
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.