Пользовательский пользователь django и администратор django

#views.py

def destroy(self, request,pk, *args, **kwargs):
        employee = get_object_or_404(Employee, pk=pk)
        user = CustomUser.objects.filter(id = employee.user.id)
        print('employee', employee)
        print('user', user)
        employee.delete()
        user.delete()  # manually delete linked user
        return Response({"detail": "Employee and user deleted successfully."}, 
        status=status.HTTP_204_NO_CONTENT)

#models.py

#Базовая модель

class BaseModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, unique=True, editable=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

# Пользовательская модель пользователя

class CustomUser(AbstractBaseUser,BaseModel):
    EMPLOYEE = "employee"
    CLIENT = "client"
    USER_TYPE_CHOICES = [
        ( EMPLOYEE, 'Employee'),
        (CLIENT, 'Client'),
    ]

    email = models.EmailField(unique=True, validators=[email_validator])
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    user_type = models.CharField(max_length=10, choices=USER_TYPE_CHOICES)
    username = None  # Remove username field since we use email for login

    objects = CustomUserManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["user_type"]

    def __str__(self):
        return f"{self.email} - {self.user_type}"

#Модель сотрудника

class Employee(BaseModel):

    MALE = "Male"
    FEMALE = "Female"
    OTHER = "Other"
    GENDER_CHOICES = [
        (MALE, "Male"),
        (FEMALE, "Female"),
        (OTHER, "Other"),
    ]
    
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, 
    related_name="employee")
    name = models.CharField(max_length = 250)
    father_name = models.CharField(max_length=250)
    contact_no = models.CharField(max_length=250, validators=[contact_no_validator])
    alternate_contact_no = models.CharField(max_length=15, validators=[contact_no_validator], 
    null=True, blank=True)
    gender = models.CharField(max_length=10, choices= GENDER_CHOICES, default=MALE)
    pan_no = models.CharField(max_length=20)
    aadhar_no = models.CharField(max_length=12, validators=[aadhar_no_validator])
    dob = models.DateField(null=True, blank=True)
    department = models.ForeignKey(Department, on_delete=models.SET_NULL, 
    related_name="department_employees", null=True)
    designation = models.ForeignKey(Designation, on_delete= models.SET_NULL, 
    related_name="designation_employees", null=True)
    joining_date = models.DateField()
    # role = models.ForeignKey()
    basic_salary = models.IntegerField()
    
    
    def __str__(self):
        return self.name



#settings.py
# User authentication model 
AUTH_USER_MODEL = "app.CustomUser"

всякий раз, когда я пытаюсь удалить пользователя, я получаю ошибку

django.db.utils.ProgrammingError: operator does not exist: integer = uuid LINE 1: ...django_admin_log» WHERE „django_admin_log“. „user_id“ IN ('277d3... ^ СОВЕТ: Ни один оператор не соответствует заданным типам имени и аргумента. Возможно, вам потребуется добавить явное приведение типов.

может ли кто-нибудь помочь мне?

Вероятно, вы изменили свое поле id в BaseModel с integer на uuid после первоначальной миграции. Это привело к несоответствию между исходным типом данных id (integer), который ожидает база данных, и измененным типом данных (uuid), который вы использовали. Подобные изменения следует вносить до вашей первоначальной миграции, а не после нее.

Если вы все еще находитесь в разработке и вам нечего терять, вы можете устранить проблему, удалив базу данных и создав ее заново. Например, когда я столкнулся с такой же ошибкой, я вспомнил, что мне пришлось запускать в dbshell:

DROP DATABASE <database_name>;

и затем заново создайте базу данных перед повторным запуском миграции. Пожалуйста, используйте это решение только в процессе разработки.

Я рекомендую использовать пользовательскую систему ведения журнала администратором или не удалять пользователей, которые связаны с Log Entry.

Но в вашем случае, поскольку вы удаляете пользователей вручную (не от администратора), тем лучше, измените следующим образом,

views.py

        user = CustomUser.objects.filter(id = employee.user.id)
        print('employee', employee)
        print('user', user)
        employee.delete()

Попробуйте вместо этого использовать приведенный выше код,

        user = CustomUser.objects.get(id=employee.user.id)
        employee.delete()
        try:
            user.delete()
        except Exception as e:
            print("Error deleting user:", e)
Вернуться на верх