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
(这是模型中主键的默认字段)。
我正在尝试从与 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
(这是模型中主键的默认字段)。