Django 模型:使用 OneToOneField 访问相关对象中的父对象属性

Django Models: Accessing Parent Object Attribute Within a Related Object Using OneToOneField

我正在尝试从与 OneToOneField 相关的配置文件对象访问 Django 用户对象的用户名属性。

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    username = models.TextField(default=user.username, primary_key=True)
    image = models.ImageField(upload_to='images/profile')
    header = models.CharField(max_length=64)
    slug = AutoSlugField(populate_from='x')
    bio = models.CharField(max_length=300, blank=True)

这样做的目的是能够使用 ReactJS 前端通过将登录时提供的用户名传回 Django API 中的配置文件详细信息端点来获取配置文件对象,其中用户名是主要的端点的密钥。

path('<pk>/profile/', ShowProfilePageView.as_view(), name='show_profile_page'),

我已经为传递给配置文件用户名属性的默认参数尝试了很多不同的方法,但到目前为止没有任何效果。这甚至可能吗?

附录 1:ShowProfilePageView 视图

class ShowProfilePageView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    model = Profile

要访问一对一字段的属性,您可以这样做:

profile = Profile.objects.get(pk='profile_pk') # an object of profile
username = profile.user.username

通过用户名搜索个人资料:

profile = Profile.objects.get(user=User.objects.get(username='username'))

因此,您不需要在 Profile class

上定义 username 字段

我认为您可以简单地覆盖视图中的 lookup_field,如下所示:

class ShowProfilePageView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    model = Profile
    lookup_field='user__username'
    lookup_url_kwarg='username'

并像这样更新 url:

path('<str:username>/profile/', ShowProfilePageView.as_view(), name='show_profile_page')

因为通过lookup_field,视图将从配置文件模型中查找用户模型中的值。而lookup_url_kwargs就是从url中映射出它应该使用什么值。可以在 documentation 中找到更多信息。 仅供参考 你应该从 Profile 模型中删除 username 字段,它应该使用 AutoField(这是模型中主键的默认字段)。