为什么在具有OneToOneField的模型上使用我的get_queryset不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在具有OneToOneField的模型上使用我的get_queryset不起作用相关的知识,希望对你有一定的参考价值。
Hello Django程序员,
我有一个我不明白的问题。
这是我的模特班:
class Profile(models.Model):
name = models.CharField(max_length=50)
employeeView = models.BooleanField(default=True)
owner = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE, null=True)
此类扩展了我的用户模型。请注意,我在这里使用的是与用户模型有关的OneToOneField。
此模型已使用该序列化器序列化:
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
fields = (
'url',
'pk',
'name',
'employeeView')
最后,我拥有用于处理对数据库的GET(列表)和POST请求的视图:
下面的视图工作正常(适用于GET请求),但它为我提供了与所有用户相关的所有个人资料
class ProfileList(generics.ListCreateAPIView):
permission_classes = [
permissions.IsAuthenticated
]
serializer_class = ProfileSerializer
name = 'profile-list'
queryset = Profile.objects.all()
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
因为我想创建一个视图,该视图只能为我的用户提供个人资料,所以我在视图上方进行了如下修改:
class ProfileList(generics.ListCreateAPIView):
permission_classes = [
permissions.IsAuthenticated
]
serializer_class = ProfileSerializer
name = 'profile-list'
##queryset = Profile.objects.all()
def get_queryset(self):
return self.request.user.profile.all()
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
但是当我发送GET请求时,出现此错误:码“配置文件”对象没有属性“全部”code
所以我的问题在这里更笼统。当我将在Profile模型的ForeignKey字段而不是OneToOneField中使用时,以上视图将起作用。在这种情况下,在我看来,我将请求属于用户的所有对象,例如:
def get_queryset(self):
return self.request.user.profile.all()
我将获得必要的数据。但是,当我们拥有OneToOneField时,如何请求对象?看来过程有所不同,但我在任何地方都找不到。
all()
意味着存在many个相关对象,因此适用于反向一对多(ForeignKey
)和多对多(ManyToManyField
)调用。
在一对一(OneToOneField
)的情况下,顾名思义,一个对象可以与相关模型的对象之一[all
没有意义-类似方法。
get_queryset
方法应该返回对象的查询集,而不是单个查询集。因此,您不能使用self.request.user.profile
,因为它仅指一个实例。您需要返回一个查询集,其中只有与请求Profile
相关的User
的唯一实例:
def get_queryset(self):
return Profile.objects.filter(owner=self.request.user)
以上是关于为什么在具有OneToOneField的模型上使用我的get_queryset不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 ForeignKey 上设置 unique=True 与使用 OneToOneField 的效果相同
Django模型中的OneToOneField和ForeignKey有什么区别?
Django模型中的OneToOneField和ForeignKey有啥区别
我无法使用用户模型创建 OneToOneField 和 ForeignKey 字段?
DjangoRestFramework - 如何使用模型序列化程序访问 OneToOneField 反向关系的其他字段?