【发布时间】:2016-05-30 14:03:28
【问题描述】:
我正在尝试按照Django REST Framework guide 在 Django REST Framework 中保存嵌套关系,但我做不到。
我有一个类“Asiento”,它是另一个类“Apunte”的外键。当我得到每个“Asiento”时,Django REST Framework 会返回它们以及它们所有的“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''
}
]
}
如果我调试代码,只有执行的“创建”方法是视图集的方法,但它不会从序列化程序运行“创建”方法。
使用此代码,我无法保存“Asiento”和“Apunte”。我究竟做错了什么?感谢您的任何回答!
我正在使用 python 2.7(由于外部原因无法更新)和 Django REST Framework 3.3.2。
【问题讨论】:
-
您是否收到任何错误消息?
标签: python django python-2.7 django-rest-framework