我安装了Django 1.10和Django REST框架。
我很好地收到了POST请求,但是在创建内容之前,我希望它能对字段执行一些任务,并且我的views.py文件中包含以下内容
from rest_framework.decorators import detail_route
from rest_framework import serializers
from suds.client import Client
import base64
from . import views
# Create your views here.
from cfdipanel.models import Report, Invoice, UserProfile
from cfdi.serializers import ReportSerializer, InvoiceSerializer, UserProfileSerializer
class ReportViewSet(viewsets.ModelViewSet):
queryset = Report.objects.all()
serializer_class = ReportSerializer
@detail_route(methods=['post'])
def set_invoice(self, request, pk=None):
#get report object
my_report = self.get_object()
serializer = InvoiceSerializer(data=request.data)
if serializer.is_valid():
serializer.save(report=my_report)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
这是我的文件serializer.py的一部分
from rest_framework import serializers
from cfdipanel.models import Report, Invoice, UserProfile
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ('user', 'karma')
class InvoiceSerializer(serializers.ModelSerializer):
class Meta:
model = Invoice
fields = ('uuid', 're', 'rr', 'tt',
'emision_date', 'type_invoice', 'status', 'owner')
class ReportSerializer(serializers.ModelSerializer):
owner = UserProfileSerializer(read_only=True)
ownerId = serializers.PrimaryKeyRelatedField(write_only=True,
queryset=UserProfile.objects.all(),
source='owner')
invoices = InvoiceSerializer(many=True,
read_only=True,
source='invoice_set')
class Meta:
model = Report
fields = ('id', 'title', 'body', 'owner', 'ownerId', 'invoices')
这是models.py的一小段
class Invoice(models.Model):
owner = models.ForeignKey(UserProfile)
report = models.ForeignKey(Report)
uuid = models.CharField(max_length=36)
emision_date = models.CharField(max_length=28)
re = models.CharField(max_length=13)
rr = models.CharField(max_length=13)
type_invoice = models.CharField(max_length=10)
status = models.CharField(max_length=2, blank=True)
tt = models.DecimalField(max_digits=19, decimal_places=9,
default=Decimal(0))
def __str__(self):
return self.uuid
状态字段为空,要填充它,我想在保存字段之前在view.py中执行类似于以下代码的操作:
url = 'https://an-api.com/ConsultService.svc?wsdl'
client = Client(url)
string = "?re=" + re + "&rr=" + rr + \
"&tt=" + tt + "&id=" + uuid
response = client.service.Consulta(string)
# Create content for field status
status = response.Status
从Web服务获得响应后,然后保存并创建“发票”内容。
request.data
返回一个dict
实例,并InvoiceSerializer
返回一个Invoice
“实例”,因此您可以在反序列化之前或之后修改数据。使用:
data = request.data
data['field'] = 'foo'
或者
serializer = InvoiceSerializer(data=request.data)
serializer.object.invoice_field = 'foo'
对于DRF 3
serializer = InvoiceSerializer(data=request.data)
serializer.save(invoice_field ='foo')
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句