python create line_python – 默认情况下,`.create()`方法不支持可...

关于DRF中的中间模型与多对多关系的序列化,我遇到了一个大问题:如果请求方法得到了,那么一切都可以完美运行.但是只要我尝试POST或PUT Data到API,我就会收到以下错误:

Traceback (most recent call last):

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response

response = self.process_exception_by_middleware(e, request)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response

response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view

return view_func(*args, **kwargs)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view

return self.dispatch(request, *args, **kwargs)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/views.py", line 477, in dispatch

response = self.handle_exception(exc)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/views.py", line 437, in handle_exception

self.raise_uncaught_exception(exc)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/views.py", line 474, in dispatch

response = handler(request, *args, **kwargs)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/generics.py", line 243, in post

return self.create(request, *args, **kwargs)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/mixins.py", line 21, in create

self.perform_create(serializer)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/mixins.py", line 26, in perform_create

serializer.save()

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/serializers.py", line 214, in save

self.instance = self.create(validated_data)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/serializers.py", line 888, in create

raise_errors_on_nested_writes('create', self, validated_data)

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/djangorestframework-3.5.3-py2.7.egg/rest_framework/serializers.py", line 780, in raise_errors_on_nested_writes

class_name=serializer.__class__.__name__

AssertionError: The `.create()` method does not support writable nested fields by default.

Write an explicit `.create()` method for serializer `manager.serializers.EquipmentSerializer`, or set `read_only=True` on nested serializer fields.

我不确定如何编写正确的创建和更新功能,我真的不明白它,如何在文档中解释它.

码:

views.py:

from django.shortcuts import render

from django.contrib.auth.models import User, Group

from manager.serializers import *

from rest_framework import generics

from rest_framework import viewsets

from rest_framework.decorators import api_view

from rest_framework.response import Response

from rest_framework.views import APIView

from django.forms.models import model_to_dict

class OrderSetDetails(generics.RetrieveUpdateDestroyAPIView):

queryset = Order.objects.all()

serializer_class = OrderSerializer

class OrderSetList(generics.ListCreateAPIView):

queryset = Order.objects.all()

serializer_class = OrderSerializer

class EquipmentSetDetails(generics.RetrieveUpdateDestroyAPIView):

queryset = Equipment.objects.all()

serializer_class = EquipmentSerializer

class EquipmentSetList(generics.ListCreateAPIView):

queryset = Equipment.objects.all()

serializer_class = EquipmentSerializer

class UserViewSet(viewsets.ModelViewSet):

queryset = User.objects.all().order_by('-date_joined')

serializer_class = UserSerializer

class GroupViewSet(viewsets.ModelViewSet):

queryset = Group.objects.all()

serializer_class = GroupSerializer

class ClientList(generics.ListCreateAPIView):

queryset = client.objects.all()

serializer_class = ClientSerializer

serializers.py

from rest_framework import serializers

from django.contrib.auth.models import User, Group

from storage.models import *

class AssignmentSerializer(serializers.HyperlinkedModelSerializer):

id = serializers.ReadOnlyField(source = 'Order.id')

name = serializers.ReadOnlyField(source = 'Order.name')

class Meta:

model = Assignment

fields = ('id', 'name', 'quantity')

class EquipmentSerializer(serializers.ModelSerializer):

event = AssignmentSerializer(source= 'assignment_set', many = True)

class Meta:

model = Equipment

fields = '__all__'

class ClientSerializer(serializers.ModelSerializer):

class Meta:

model = client

fields = '__all__'

class UserSerializer(serializers.HyperlinkedModelSerializer):

class Meta:

model = User

fields = ('url', 'username', 'email', 'groups')

class GroupSerializer(serializers.HyperlinkedModelSerializer):

class Meta:

model = Group

fields = ('url', 'name')

class OrderSerializer(serializers.ModelSerializer):

class Meta:

model = Order

fields = '__all__'

models.py:

from __future__ import unicode_literals

from django.db import models

from storage.choices import *

# Create your models here.

class Equipment(models.Model):

name = models.CharField(max_length=30)

fabricator = models.CharField(max_length=30, default='-')

storeplace = models.IntegerField()

labor = models.CharField(max_length=1, choices=labor_choices)

event = models.ManyToManyField('Order', blank = True, through= 'Assignment', through_fields=('Equipment', 'Order'))

max_quantity = models.IntegerField(default=1, null = True)

status = models.CharField(max_length=8, choices = STATUS_CHOICES, default = 'im Lager')

def __str__(self):

return self.name

class client(models.Model):

firstname = models.CharField(max_length=30)

secondname = models.CharField(max_length=30)

email = models.EmailField()

post_code = models.IntegerField()

city = models.CharField(max_length=30)

street= models.CharField(max_length=30)

def __str__(self):

return "%s %s" % (self.firstname, self.secondname)

class Order(models.Model):

name = models.CharField(max_length=30)

Type = models.CharField(

max_length=2,

choices=TYPE_CHOICES,

default='Rental',

)

city = models.CharField(max_length=30)

street= models.CharField(max_length=30)

date = models.DateField()

GuestNumber = models.IntegerField()

description = models.TextField()

client = models.ForeignKey("client", on_delete=models.CASCADE, blank = True, null = True)

status = models.CharField(max_length=30, choices=order_choices, default='glyphicon glyphicon-remove')

def __str__(self):

return self.name

class Assignment(models.Model):

Equipment = models.ForeignKey('Equipment', on_delete=models.CASCADE)

Order = models.ForeignKey('Order', on_delete=models.CASCADE)

quantity = models.PositiveIntegerField(default=1)

提前致谢.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值