Почему Django не находит поле, добавленное в AbstractBaseUser
Я унаследовал от AbstractBaseUser следующее:
class User(AbstractBaseUser):
"""
Main User model, inherits from AbstractBaseUser
"""
# Meta
email = models.EmailField(verbose_name='email', max_length=60, unique=True)
username = models.CharField(max_length=40, unique=True) # equals to email
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
employee_of = models.OneToOneField(Customer, on_delete=models.SET_NULL, null=True)
Таким образом, каждый пользователь связан с одним и только одним клиентом.
Теперь в представлении я хочу получить доступ к экземпляру текущего вошедшего пользователя в объекте request и получить значение employee_of, чтобы получить набор запросов, содержащий всех пользователей этого клиента.
def render_employees(request):
"""
Renders the employees page of the dashboard
:param request:
:return:
"""
# Return the value for the current site for css specific classes
dashboard_site = 'employees'
# Query the employees
qs_employees = User.objects.filter(employee_of=request.user.employee_of) # doesn't find field
...
Однако фильтр не работает, потому что request.user.employ_of ничего не возвращает. Моя IDE даже предлагает, например, username, date_joined и т.д., но не employee_of,
Почему?
class Customer(models.Model):
"""
A table that stores static data about a customer, usually a legal company
"""
legal_name = models.CharField(max_length=50)
street = models.CharField(max_length=30)
street_number = models.CharField(max_length=3)
def __str__(self):
return self.legal_name
Похоже, что request.user - это другая модель. Это модель User из django.contrib.auth. https://docs.djangoproject.com/en/4.0/ref/contrib/auth/#django.contrib.auth.models.User.
Что вы можете с этим сделать?
В нашем приложении у нас есть модель UserProfile, которая имеет отношение OnetoOne к django User.
Вы можете хранить значение employee_of там.
class UserProfile(AbstractBaseUser):
user = models.OnetoOneField("auth.User", related_name="user_profile", on_delete=models.CASCADE)
employee_of = models.OneToOneField(Customer, on_delete=models.SET_NULL, null=True)
и затем получить доступ к request.user сотрудникам, используя что-то вроде
request.user.user_profile.employee_of