"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модель раздел документации .