为什么在具有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 反向关系的其他字段?

Django Model OneToOneField 无需创建额外的 _id 数据库列