Django rest framework create or update in POST resquest

Question:

can anyone help please, with DRF

according to POST request, I want to create(if not exists) or update() table

belows are my codes

model.py

class User1(models.Model):
    user = models.CharField(max_length=10)
    full_name = models.CharField(max_length=20)
    logon_data = models.DateTimeField(blank=True, null=True)

serializer.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User1
        fields = '__all__'

views.py

from .models import User1
from .serializers import UserSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view

@api_view(['GET', 'POST'])
def UserView(request):
    if request.method == 'GET':
        users = User1.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        users = User1.objects.all()
        serializer = UserSerializer(data=request.data, many=True)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('users/', views.UserView),
]

when POST request, I want to check like this:

if user exists:
  if user.full_name == request.fullname
     update (user.logon_data)
     save()
  else:
     update (user.full_name)
     update (user.logon_data)
     save()
else:
  create(
       user = request.user,
       full_name = request.full_name,
       logon_data = request.logon_date)
  save()

POST request for JSON like this:

[
    {
        "user": "testuser1",
        "full_name": "test user1",
        "logon_data": "2022-10-19 09:37:26"
    },
    {
        "user": "testuser2",
        "full_name": "test user2",
        "logon_data": "2022-10-20 07:02:06"
    }
]
Asked By: Jonibek

||

Answers:

Try this update_or_create it will check based on request.user whether it exists in table or not
Also ensure that request.user is checked to user object if you want to check specific field then it should be request.user.user

User.objects.update_or_create(user=request.user.user, defaults={"full_name": request.full_name, "logon_date":request.logon_date})
Answered By: Deepak Tripathi
@api_view(['GET', 'POST'])
def UserView(request):
    if request.method == 'GET':
        users = User1.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        serializer = UserSerializer(data=request.data, many=True)
        # if serializer validation fails, raises error by itself
        serializer.is_valid(raise_exception=True)
        for data in serializer.validated_data:
            # checking if data exists else creating an object in User1 model
            # user = data['user'] --> filter to check if that user exist
            # defaults={'full_name': data['full_name'], 'logon_data': #data['logon_data']} --> value provided in defaults is used to update data in #model once the condition is met.
            User1.objects.update_or_create(user=data['user'], defaults={'full_name': data['full_name'], 'logon_data': data['logon_data']})
        return Response(serializer.data, status=201)