如果 Django Rest Framework 中的“电子邮件已经存在”,则更新

Mig*_*jas 2 django serialization django-rest-framework

我在 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() 是否折旧。我没有找到有关它的真实信息。

Cat*_*oha 8

您在模特的电子邮件字段中有“unique=True”,对吗?如果是这样,我认为序列化程序会在您运行时检查是否是这种情况:

serializer.is_valid()
Run Code Online (Sandbox Code Playgroud)

为了克服这个问题,您可以尝试将其添加到序列化器的 Meta 类中:

extra_kwargs = {
    'email': {'validators': []},
}
Run Code Online (Sandbox Code Playgroud)

如果您想保留电子邮件验证,您可以尝试:

from django.core.validators import EmailValidator

class Meta:
    #... your code
    extra_kwargs = {
        'email': {'validators': [EmailValidator,]},
    }
Run Code Online (Sandbox Code Playgroud)


Mig*_*jas 5

最后,解决方案是这样的:

from .models import Candidates
from rest_framework import serializers
from django.core.validators import EmailValidator

# first we define the serializers
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'
        )
    extra_kwargs = {'email': {'validators': [EmailValidator,]},
  }
Run Code Online (Sandbox Code Playgroud)

还有我的 view.py

@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 = Candidates.objects.update_or_create(email=serializer.validated_data.get('email', None), defaults=serializer.validated_data) 
        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)

它工作正常。