[英]Django Rest Framework XML - Create multiple objects with a different xml name field compared to the Django Model
我正在将以下信息发送给Django(1.6.11)Rest Framework(3.0.5)一个XML文件(我对该文件没有控制权)。
<?xml version="1.0" encoding="utf-8"?>
<Company xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Invoices>
<Invoice>
<Id />
<Number>150</Number>
<Date>2012-11-20</Date>
<InvoiceItems>
<Item>
<Sku>MAT</Sku>
<Description>Example description</Description>
<Total>10</Total>
</Item>
<Item>
<Sku>RMS</Sku>
<Description>Example description 2</Description>
<Total>10</Total>
</Item>
</InvoiceItems>
<Carriage>
<Sku />
<UnitPrice>20</UnitPrice>
</Carriage>
<ItemsTotal>50</ItemsTotal>
</Invoice>
</Invoices>
</Company>
如何遍历这些项目(“发票”>“发票”>“ InvoiceItems”>“项目”>)并保存链接到其“发票”模型的每个对象(项目)?
models.py
class Invoice(models.Model):
id = models.CharField(primary_key=True,max_length=10)
invoice_date = models.DateTimeField()
total = models.DecimalField(max_digits=10, decimal_places=2, default=0)
items = models.ForeignKey('Item', blank=True, null=True, related_name='items')
carriage = models.ForeignKey('Carriage', blank=True, null=True, related_name='carriage')
class Item(models.Model):
item_sku = models.CharField(max_length=100, blank=True)
item_description = models.CharField(max_length=400, blank=True)
item_total = models.DecimalField(max_digits=10, decimal_places=2, default=0)
class Carriage(models.Model):
carriage_sku = models.CharField(max_length=100, blank=True)
carriage_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
views.py
@api_view(['POST'])
@parser_classes((XMLParser,))
def zynk_upload(request, format=None):
if request.method == 'POST':
data = request.data
serializer = InvoiceSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.py
class InvoiceSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Invoice
fields = ('id', 'invoice_date', 'total', 'carriage','items')
def to_internal_value(self, data):
id = data['Invoices']['Invoice']['Number']
invoice_date = data['Invoices']['Invoice']['Date']
total = data['Invoices']['Invoice']['ItemsTotal']
carriage_sku = data['Invoices']['Invoice']['Carriage']['Sku']
carriage_price = data['Invoices']['Invoice']['Carriage']['UnitPrice']
item_sku = data['Invoices']['Invoice']['InvoiceItems']['Item']['Sku']
item_description = data['Invoices']['Invoice']['InvoiceItems']['Item']['Description']
item_total = data['Invoices']['Invoice']['InvoiceItems']['Item']['Total']
return {
'id': id,
'invoice_date': invoice_date,
'total': total,
'carriage': {
'carriage_sku': carriage_sku,
'carriage_price': carriage_price,
},
'items': {
'item_sku':item_sku,
'item_description': item_description,
'item_total': item_total,
},
}
def create(self, validated_data):
carriage_data = validated_data.pop('carriage')
carriage_id = Carriage.objects.create(**carriage_data)
items_data = validated_data.pop('items')
items_id = Item.objects.create(**items_data)
return Invoice.objects.create(carriage=carriage_id, items=items_id,**validated_data)
如果字段名称不同,我相信您可以通过类作用域变量指定映射到/来自的名称:
class InvoiceSerializer(serializers.HyperlinkedModelSerializer):
my_xml_name = serializers.CharField(source='my_django_name')
[...]
class Meta:
[...]
fields = ([...], 'my_xml_name')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.