为什么将我的get_queryset与OneToOneField一起用于模型时不起作用

时间:2019-11-14 18:32:53

标签: django django-rest-framework

你好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时,如何请求对象?似乎该过程有所不同,但是我在任何地方都找不到它。

2 个答案:

答案 0 :(得分:0)

all()暗示有许多个相关对象,因此这适用于反向一对多(ForeignKey)和多对多({{ 1}})。

在一对一(ManyToManyField)的情况下,顾名思义,一个对象只能与相关模型的一个对象 相关,因此没有这里的OneToOneField类方法的重点。

现在,all方法应该返回一个对象的查询集,而不是单个对象。因此,您不能使用get_queryset,因为它仅指一个实例。

您需要返回一个查询集,其中包含与请求self.request.user.profile相关的唯一Profile实例:

User

答案 1 :(得分:0)

文档https://docs.djangoproject.com/en/2.2/topics/db/examples/one_to_one/说,您将使用user.profile访问用户配置文件。这是有道理的,因为它是一个OneToOneField,所以我们不应该期望QuerySet只是一个对象。