Django Поле OneToOne - нет обратного метода доступа к AUTH_USER_MODEL - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь расширить пользовательскую модель Django по умолчанию, на которую ссылается settings.AUTH_USER_MODEL, с помощью настраиваемой модели UserProfile. В каждом случае, когда я использую OneToOne-Relationship, я также получаю средство доступа к указанной модели. Обычно это работает:

class ModelA(models.Model):
   text = models.CharField(max_length=100)

class ModelB(models.Model):
   link_to_model_a = models.OneToOneField(ModelA, on_delete=models.CASCADE)


model_a = ModelA()
model_a.modelb  # Works fine

Но в данном случае это не работает (фрагмент сокращен):

class UserProfile(models.Model):
    # There are more fields, but removed
    # for this example

    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )


from django.contrib.auth import get_user_model
get_user_model().userprofile # Causes AttributeError: type object 'User" has no attribute 'userprofile'

Я не смог найти никакой информации о том, может ли это явление появиться из-за отношение к пользовательской модели djangos по умолчанию. Может быть, они по-особенному относятся к этому и не разрешают обратный доступ?

Я очень благодарен за любую помощь в этом вопросе.

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

Попробуйте напрямую добавить отношение yo YourCustomUserModel в случае, если вы используете специфику c one, если нет, вы можете просто добавить User модель:

from my_app import YourCustomUserModel

class UserProfile(models.Model):
    # There are more fields, but removed
    # for this example

    user = models.OneToOneField(
        YourCustomUserModel,
        on_delete=models.CASCADE
    )

Если вы используете пользователя по умолчанию модель вы можете go с:

from django.contrib.auth.models import User  # check this line

class UserProfile(models.Model):
    # There are more fields, but removed
    # for this example

    user = models.OneToOneField(
        User,  # check this line
        on_delete=models.CASCADE
    )

И поскольку вы не будете менять своего пользователя AUTH_USER_MODEL так часто (или никогда), у вас не будет никаких проблем с этим, просто помните, измените его здесь тоже если случайно вам придется использовать другой.

0 голосов
/ 10 августа 2020

Мне удалось найти решение самостоятельно.

В этом случае я разделил свои модели на отдельные файлы. Я использовал файл __ init __.py в моем каталоге / models /, но явно не импортировал все мои модели в __ init __. Py.

После этого Django смог найти мое OneToOne-соединение из UserProfile в его User-модель, и все работает нормально.

Спасибо всем за вашу помощь!

0 голосов
/ 07 августа 2020

Причина в том, что get_user_model() возвращает класс User, а не User(). Итак, вы не смогли получить доступ к userprofile.

Он пытается получить доступ к атрибуту stati c, присутствующему в User с именем userprofile.

...