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