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

Вернуться на верх