"self.fields['field_name'].queryset" в Djano, можно ли его применить к полю OneToOne?
Я новичок в Django и пытаюсь разобраться в отношениях между полями OneToOne с помощью _set.all()
Мой models.py
class User(AbstractUser):
is_admin = models.BooleanField(default=False)
is_employee = models.BooleanField(default=True)
is_manager = models.BooleanField(default=False)
is_assistant = models.BooleanField(default=False)
class Profile(models.Model):
profile = models.OneToOneField(User, on_delete=models.CASCADE)
class Manager(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
user_profile = models.OneToOneField(Profile, on_delete=models.CASCADE)
Я пытаюсь обновить экземпляр Manager и не совсем понимаю, почему self.instance.user.profile_set.all()
продолжает бросать ошибку "'User' object has no attribute 'profile_set'". AttributeError в этой секции:
forms.py
elif self.instance.pk:
self.fields['user_profile'].queryset = self.instance.user.profile_set.all()
Надеюсь, мой вопрос понятен, любая помощь будет очень признательна! Будьте здоровы!
Вы можете получить доступ к связанным Profile
из User
с помощью:
myuser.profile
Действительно, OneToOneField
по сути является ForeignKey
с ограничением unique=True
. Это означает, что для User
существует не более одного связанного Profile
. Параметр related_name=…
[Django-doc] по умолчанию представляет собой имя класса (здесь Profile
) в нижнем регистре (поэтому profile
). Таким образом, вы можете получить доступ к связанному Profile
с помощью .profile
. Это вызовет ошибку AttributeError
в случае, если такой Profile
не существует.
Моделирование менеджера, однако, имеет избыточные данные: вам не нужно указывать ни User
, ни Profile
, вы можете определить второе по первому. Вводя дублирующие данные , вы делаете возможным существование в будущем Manager
, где user
обновляется, а user_profile
не обновляется и наоборот. Если вам нужен profile
и вы храните user
, вы можете обратиться к нему с помощью mymanager.user.profile
, а если вы храните user_profile
, вы можете обратиться к нему с помощью mymanager.user_profile.user
. Таким образом, хранить оба варианта не имеет особого смысла.
Примечание: Обычно лучше использовать
settings.AUTH_USER_MODEL
[Django-doc] для ссылки на модель пользователя, чем использоватьUser
модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка наUser
модель раздел документации .