Django, обновить одно и то же поле строки в модели, получив данные из сериализатора

У меня эта модель:

class AgentDetail(MethodID):

    first_name = models.CharField(max_length=50, blank=True, null=True, unique=True)
    last_name = models.CharField(max_length=50, unique=True, null=True)
    email = models.EmailField(null=False)
    authen_method = models.ForeignKey(AuthMethodID, on_delete=models.CASCADE)
    country_code = models.BigIntegerField(default=1)
    mobile_number = models.BigIntegerField(null=False)
    sms_provider = models.CharField(max_length=50, null=True)
    active_status = models.BooleanField(default=True)
    created_time = models.DateTimeField(default=now, editable=False)
    created_by = models.CharField(max_length=50)
    updated_time = models.DateTimeField(auto_now=True)
    updated_by = models.CharField(max_length=50)

и этот сериализатор:

class AgentSerializer(serializers.ModelSerializer):
    class Meta:
        model = AgentDetail
        fields = [
            "first_name",
            "last_name",
            "email",
            "authen_method",
            "mobile_number",
            "sms_provider",
        ]

и этот views.py:

@api_view(["POST"])
def create_agent(request):
    if request.method == "POST":
        serializer = AgentSerializer(data=request.data, many=False)
        if serializer.is_valid():
            serializer.save()
            request_data = serializer.data
            # AgentDetail.objects.update_or_create(
            #     created_by=request_data["first_name"] + request_data["last_name"],
            #     updated_by=request_data["first_name"] + request_data["last_name"],
            # )
            return Response(status=status.HTTP_200_OK)
        error = Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        return error

В сериализаторе я не передаю поле created_by и мне нужно, чтобы это поле получало значение first_name+last_name, которые поступают из данных сериализатора.Я новичок в DRF.

вы можете получить доступ к validated_data в методе create и добавить любые дополнительные данные, которые вы хотите.

serializer.py

class AgentSerializer(serializers.ModelSerializer):
    ...

    def create(self, validated_data):
        first_name = validated_data.get('first_name', '')
        last_name = validated_data.get('last_name', '')
        validated_data.update(dict(
            created_by=first_name+last_name,
            updated_by=first_name+last_name
        ))
        return super().create(validated_data)

Как сказано в docs, вы можете передать дополнительные атрибуты методу save.

views.py

@api_view(["POST"])
def create_agent(request):
    if request.method == "POST":
        serializer = AgentSerializer(data=request.data, many=False)
        if serializer.is_valid():
            request_data = serializer.data
            serializer.save(
                created_by=request_data["first_name"] + request_data["last_name"],
                updated_by=request_data["first_name"] + request_data["last_name"],
            )
            return Response(status=status.HTTP_200_OK)
        error = Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        return error
Вернуться на верх