Django Rest framework, нарушено ограничение not-null DETAIL
У меня вопрос по поводу моих сериализаторов. У меня следующая структура, обобщающая. Состоит из 3 моделей и представления CreateAPIView B содержит OneToOneField = A C содержит ForeingKey = B (many = True) [{List Image}]. Я не очень понимаю, как выполнить метод create во вложенном сериализаторе.
class A (serializer.ModelSerializer):
class Meta:
model = A
class B (serializer.ModelSerializer):
A = CreateASerializer () # OneToOneField to A
C = CreateBSerializer (many = True) # ForeingKey to B List [{}]
class Meta:
model = B
class C (serializer.ModelSerializer):
class Meta:
model = C
#Can I separately create the Create method for each serializer?
# For instance:
class A (serializer.ModelSerializer):
class Meta:
model = A
def create (self, validated_data):
return models.A.create (** validated_data)
class B (serializer.ModelSerializer):
A = CreateASerializer () # OneToOneField
C = CreateBSerializer (many = True) # ForeingKey List [{image}]
class Meta:
model = B
fields = ('A', 'detail', 'C')
def create (self, validated_data):
A_data = validated_data.pop ('A')
C_data = validated_data.pop ('C')
date1 = models.B.objects.create (**validated_data)
date2 = models.C.objects.create (**validated_data)
for f in A_data:
models.A.objects.create (date1=date1, **f)
for nu in C_data:
models.C.objects.create (date2=date2, **nu)
return ?
class C (serializer.ModelSerializer):
class Meta:
model = C
def create (self, validated_data):
C_data = validated_data.pop (**validated_data)
B = models.C.objects.create (**validated_data)
for dat in C_data:
models.C.objects.create (B=B, **dat)
return B
Я читал 'https://www.django-rest-framework.org/api-guide/relations/', Но я делаю что-то не так.
class EDFSerializer(serializers.ModelSerializer):
evento = CrearEventoSerializer()
fotodanodetail = FotoDanoFiltroSerializer(many=True) # related_name='fotodanodetail'
class Meta:
model = models.Dano
fields = ('evento','observacion','fotodanodetail')
def create(self, validated_data):
evento_data = validated_data.pop('evento')
foto_data = validated_data.pop('fotodanodetail')
evento = models.Dano.objects.create(**validated_data)
dano = models.FotoDano.objects.create(**validated_data)
for da in evento_data:
models.Evento.objects.create(evento=evento, **da)
print(evento_data)
for fo in foto_data:
models.FotoDano.objects.create(dano=dano, **fo)
#return dano
return evento
# Views
class CrearEDFdeListApiView(generics.CreateAPIView):
serializer_class = EDFSerializer
queryset = models.Dano.objects.all()
# def post(self, request):
# serializer = self.serializer_class(data = request.data)
# if serializer.is_valid():
# serializer.save()
# print(request.data)
# return Response({'message': 'Perfect..!'}, status= status.status.HTTP_201_CREATED)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
## Error.
null value in column "evento_id" violates not-null constraint DETAIL: Failing row contains (null, Hello this is a test ..Thanks).