"self.fields['field_name'].queryset"在Django中,是否可以应用于OneToOne字段?

"self.fields['field_name'].queryset" in Djano, can it be applied to a OneToOne field?

我是 Django 的新手,一直在努力研究与 _set.all()

的 OneToOne 字段关系

我的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' 对象没有属性 'profile_set'”AttributeError:

forms.py

elif self.instance.pk:
        self.fields['user_profile'].queryset = self.instance.user.profile_set.all()

我希望我的问题很清楚,任何帮助将不胜感激! 干杯!

您可以通过以下方式访问 User 的相关 Profile

<em>myuser</em>.<strong>profile</strong>

事实上,OneToOneField 本质上是具有 unique=True 约束的 ForeignKey。这意味着对于 User,最多 个相关 Profile。默认情况下,related_name=… parameter [Django-doc] 是 class(此处为 Profile)的小写名称(因此 profile)。因此,您可以使用 .profile 访问相关的 Profile。如果不存在这样的 Profile,它将引发 AttributeError

manager的建模有冗余数据:不需要同时指定UserProfile,可以先确定另一个。通过引入 重复数据 ,您可以在未来存在 Managers,其中 user 被更新,但 user_profile 没有并且反之亦然。如果您需要 profile 并存储 user,您可以使用 <i>mymanager</i><b>.[=61= 访问它]</b>,如果您存储 user_profile,您可以使用 <i>mymanager</i><b> 访问它。 user_profile.user</b>。因此,存储两者没有多大意义。


Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.