Пользовательский пользователь 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)