根据HTTP/1.1规范:
该
POST方法用来请求原始服务器接受被附在请求由标识的资源的新下属实体Request-URI的Request-Line
换句话说,POST用于创建.
该
PUT方法请求将所包含的实体存储在提供的实体下Request-URI.如果Request-URI引用已经存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本.如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源.
也就是说,PUT用于创建或更新.
那么,应该使用哪一个来创建资源?或者需要支持两者?
我需要在一个请求categories中多次更新Article。
在ArticleViewSet我有:
def get_serializer_class(self):
if self.action in ['partial_update', 'update']:
return ArticlePostSerializer
return ArticleSerializer
Run Code Online (Sandbox Code Playgroud)
所以ArticlePostSerializer需要改变。
这是我的序列化程序代码:
class ArticleShortCategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = 'id', 'name'
class ArticleSerializer(serializers.ModelSerializer):
categories = serializers.SerializerMethodField()
def get_categories(self, obj):
return ArticleShortCategorySerializer(obj.categories, many=True).data
class Meta:
model = Article
read_only_fields = 'id'
fields = ('categories', 'text') + read_only_fields
class ArticlePostSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = 'id', 'categories', 'text'
Run Code Online (Sandbox Code Playgroud)
我尝试添加:
class ArticlePostListSerializer(serializers.ListSerializer):
Run Code Online (Sandbox Code Playgroud)
和
class Meta:
list_serializer_class = ArticlePostListSerializer …Run Code Online (Sandbox Code Playgroud) 我在 Django 应用程序中有一个 Candidates 对象模型,我从前端的表单中获得。
如果此候选人使用同一电子邮件再次发送个人数据,DRF 响应{"email":["使用该电子邮件的用户已经存在。"]}并且不保存表单。
这个想法是,如果这个候选人再次发送带有个人电子邮件的表格并且我已经将它保存在我的数据库中,我将更新这个候选人的个人数据。
我试过:
我的看法:
@csrf_exempt
@api_view(['GET', 'POST','PATCH'])
def CandidatesCreate(request, *args, **kwargs):
parser_classes = (FileUploadParser,)
if request.method == 'PATCH' or request.method == 'POST':
serializer = CandidatesSerializer(data=request.data)
if serializer.is_valid():
instance, created = serializer.get_or_create()
if not created:
serializer.update(instance, serializer.validated_data)
return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
我的序列化器
class CandidatesSerializer(serializers.ModelSerializer):
cv = serializers.FileField(required=False,max_length=None, use_url=True)
class Meta:
model = Candidates
fields = (
'pk',
'user',
'name',
'email',
'whatever',
'whatever'
)
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用。老实说,我不确定 get_or_create() 是否折旧。我没有找到有关它的真实信息。