import uuid, random, string
from datetime import timedelta
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
from django.urls import reverse



# region ==> custom user model
class CustomUser(AbstractUser):
    username = models.CharField(
        max_length=50,
        unique=True,
        blank=True,
        verbose_name='نام کاربری'
    )
    telegram_id = models.CharField(
        max_length=50,
        null=True,
        blank=True,
        verbose_name='آیدی تلگرام'
    )
    phone_number = models.CharField(
        max_length=13,
        null=True,
        blank=True,
        verbose_name='شماره موبایل'
    )
    email = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        verbose_name='ایمیل'
    )
    refrral = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        verbose_name='معرف'
    )
    first_name = models.CharField(
        max_length=20,
        null=True,
        blank=True,
        verbose_name='نام'
    )
    last_name = models.CharField(
        max_length=40,
        blank=True,
        null=True,
        verbose_name='نام خانوادگی'
    )
    birth_date = models.DateField(
        null=True,
        blank=True,
        verbose_name='تاریخ تولد'
    )
    avatar = models.ImageField(
        upload_to='app_account/avatar/',
        null=True,
        blank=True,
        verbose_name='آواتار پروفایل'
    )
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return f"{self.first_name} {self.last_name} / {self.username}"

    class Meta:
        db_table = 'tbl_user_info'
        verbose_name_plural = 'مشخصات کاربران'
# endregion



from rest_framework import serializers
from app_account.models import (
    CustomUser
)

class UsersSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = [
            'id',
            'username',
            'telegram_id',
            'phone_number',
            'email',
            'refrral',
            'first_name',
            'last_name',
            'birth_date',
            'avatar',
            'password'
        ]
        extra_kwargs = {'password': {'write_only': True}}  

    def validate_username(self, value):
        if CustomUser.objects.filter(username=value).exists():
            raise serializers.ValidationError(
                "نام کاربری تکراری است، لطفاً مورد دیگری وارد کنید.", code=409
            )
        return value

    
    def create(self, validated_data):
        password = validated_data.pop('password', None)
        instance = CustomUser(**validated_data)
        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance   

from django.shortcuts import render
from rest_framework import viewsets, status
from rest_framework.response import Response
from app_account.models import (
    CustomUser
)
from app_account.serializers import (
    UsersSerializer
)

# region ==> viewsets for all model
class UsersViewSet(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = UsersSerializer
# endregion

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from app_account.views import UsersViewSet

router = DefaultRouter()
router.register(r'users', UsersViewSet)

app_name = 'app_account'
urlpatterns = [
    path('', include(router.urls)), # viewsets
]


من کد بالا رو نوشتم
وقتی یک رکورد جدید اضافه میشه برای من ریس\انس ۲۰۱ برمیگرده 
وقتی داده ها ولید نباشن کد ۴۰۰ برمیگرده 
ولی علی رغم اینکه گفتم وقتی داده تکراری برا ذخیره در دیتابیس پست میشه کد ۴۰۹ رو برگردونه همچنان ۴۰۰ برمیگردونه کدم رو طوری بنویس که وقتی داده تکراری ثبت و ارسال میشهه به سمت سور کد ریسپانس چیزی غیر از ۴۰۰ باش