我正试图在Django REST框架中按照Django REST Framework guide保存一个嵌套关系,但我做不到。
我有一个类“Asiento”,它是另一个类“Apunte”的外键。当我得到每个“Asiento”Django REST框架时,它会返回它们和它们的所有“Apunte”对象。这是可行的,但是当我尝试用可写嵌套序列化器创建/更新“Asiento”时,我得到了AsientoSerializer(data=data).is_valid() == False
我的模型:

class Apunte(TxerpadBase):
    debe = models.DecimalField(null=True, blank=True, max_digits=18, decimal_places=6)
    haber = models.DecimalField(null=True, blank=True, max_digits=18, decimal_places=6)
    cuenta = models.ForeignKey(Cuenta, related_name='mayor', on_delete=models.PROTECT)
    partner = models.ForeignKey(Partner, null=True, blank=True, on_delete=models.PROTECT)
    asiento = models.ForeignKey(Asiento, related_name='apuntes')
    fecha = models.DateField()
    recc = models.BooleanField(blank=True, default=False)
    conciliacion = models.ForeignKey('Conciliacion', null=True, blank=True, on_delete=models.SET_NULL)
    estado = FSMField(default='borrador')


class Asiento(TxerpadBase):
    numero = models.PositiveIntegerField(null=True, blank=True)
    fecha = models.DateField(blank=True, default=datetime.datetime.now)
    libro = models.ForeignKey('Libro', on_delete=models.PROTECT)
    periodo = models.ForeignKey(Periodo, on_delete=models.PROTECT)
    estado = FSMField(default='borrador')

我的序列化程序:
class ApunteSerializer(serializers.ModelSerializer):
    fecha = serializers.DateField(
        format='%d-%m-%Y', input_formats=('%d-%m-%Y',),
        error_messages={'invalid': 'La fecha del apunte no esta en el formato correcto.'}
    )

    class Meta:
        model = Apunte


class AsientoSerializer(serializers.ModelSerializer):
    fecha = serializers.DateField(
        format='%d-%m-%Y', input_formats=('%d-%m-%Y',),
        error_messages={'invalid': 'La fecha del asiento no esta en el formato correcto.'}
    )
    apuntes = ApunteSerializer(many=True)

    class Meta:
        model = Asiento

    def create(self, data):
        apuntes_data = data['apuntes']
        asiento_data = data
        asiento_data['fecha'] = datetime.datetime.strptime(asiento_data['fecha'], '%d-%m-%Y').date()
        del asiento_data['apuntes']
        asiento = Asiento.objects.create(**asiento_data)
        for apunte in apuntes_data:
            apunte['fecha'] = datetime.datetime.strptime(apunte['fecha'], '%d-%m-%Y').date()
            Apunte.objects.create(asiento=asiento, **apunte)

我的视图集:
class AsientoViewSet(viewsets.ModelViewSet):
    queryset = Asiento.objects.all()
    serializer_class = AsientoSerializer

    def create(self, validated_data):
        # JSON dictionary is inside validated_data.data
        serializer = AsientoSerializer(data=validated_data.data)
        if serializer.is_valid():
            return Response(serializer.data)
        else:
            raise AttributeError('Error al validar')

这是我随请求发送的JSON:
{
    u'name': u'prueba 3000',
    u'periodo': 13,
    u'fecha': u'18-02-2016',
    u'numero': None,
    u'estado': u'borrador',
    u'libro': 1,
    u'apuntes': [
        {
            u'name': u'a',
            u'recc': False,
            u'debe': u'1',
            u'haber': u'0.00',
            u'cuenta': u'5',
            u'partner': 8, u'fecha':
            u'18-02-2016',
            u'conciliacion': u''
        }
    ]
}

如果我只调试代码,执行的“create”方法是viewset的方法,但它不从序列化程序运行“create”方法。
有了这段代码,我既不能保存“Asiento”也不能保存“Apunte”。我做错什么了?谢谢你的回答!
我正在使用Python2.7(由于外部原因,我无法更新它)和DjangoRestFramework3.3.2。

最佳答案

好吧,我发现我的问题是“Apunte”对象中的“asiento”属性不能为空,我没有发送它。现在,我已经更改了“Apunte”对象中的“asiento”属性,序列化器终于可以工作了,而且在ViewSet上不需要“create”方法。
谢谢大家的回答。

关于python - 如何在Django Rest框架中保存嵌套关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35480902/

10-11 07:46