如何在api.py中获取一些(自定义)用户数据?

时间:2019-06-29 17:07:04

标签: python django django-rest-framework

我不确定如何将数据从两个“嵌套”模型传递到端点。

我想在Django应用程序中设置一些与用户相关的数据。经过一番谷歌搜索后,我发现“扩展”默认用户模型的最佳方法是使用指向用户的OneToOneField创建另一个模型。该模型如下所示:

# models.py

from django.db import models
from django.contrib.auth.models import User

class UserData(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    currency = models.CharField(max_length=10, default="USD")
    budget = models.IntegerField(default=500)
    showCategories = models.BooleanField(default=True)
    showLocations = models.BooleanField(default=True)
    showSources = models.BooleanField(default=True)

    def __str__(self):
        return self.user

写完模型后,我为它写了一个新的序列化器:

# serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'email', 'username')

class UserDataSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = UserData
        fields = ('currency', 'budget', 'showCategories', 'showLocations', 'showSources', 'user')

到目前为止一切都很好(我希望)。

最后,我将UserAPI更改为serializer_class的{​​{1}}。这就是现在的样子:

UserDataSerializer

访问端点时,我得到以下数据:

# api.py

class UserAPI(generics.RetrieveAPIView):
    permission_classes = [
        permissions.IsAuthenticated,
    ]

    serializer_class = UserDataSerializer

    def get_object(self):
        # I suppose I need to return something else here but I'm not sure what.
        return self.request

但是我希望像这样在UserData中获得所有信息:

{
  "user": {
    "id": 1,
    "email":"email@email.com",
    "username":"myusername" 
  }
}

编辑:

这是我的 { "user": { "id": 1, "email": "email@email.com", "username": "myusername" }, "currency": "USD", "budget": 500, "showCategories": true, "showLocations": true, "showSources": true } 的样子:

urls.py

2 个答案:

答案 0 :(得分:1)

不确定您的#Assign same, constant index so the merge function will fill x_all$index <- 1 y_all$index <- 1 #Merge to get all information x_y_all <- merge(x_all, y_all, by = "index") #Delete the index x_y_all$index <- NULL 视图如何返回没有定义的UserAPI

的结果

尝试一下

queryset

根据您的class UserAPI(generics.RetrieveAPIView): permission_classes = [ permissions.IsAuthenticated,] serializer_class = UserDataSerializer queryset = UserData.objects.all() lookup_field = 'pk' 版本,您的URL端点应包括Django,对于DRF,默认情况下通常为lookup_field

pk

因此,访问url(r'^user/(?P<pk>\d+)/$', views.User.as_view()) 会返回一个...../user/4/实例,其ID为4。

答案 1 :(得分:1)

如果您在api视图中使用UserDataSerializer,则get_object()应该返回模型UserData的实例,以便它的序列化程序知道要序列化的字段以及如何获取其值。

尝试一下,希望这能解决您的问题。

class UserAPI(generics.RetrieveAPIView):
    permission_classes = [ permissions.IsAuthenticated,]
    serializer_class = UserDataSerializer
    queryset = UserData.objects.all()

    def get_object(self):
        return self.request.user.userdata

建议:

您应该创建UserSerializer序列化程序,并在UserData中反向嵌套UserSerializer模型序列化,因为 User 模型将始终为每个用户提供实例,但是您保存在 UserData 模型中的额外信息可能存在或可能不存在。因此,最好对主要资源进行序列化。 然后,您的数据将看起来像这样,您当然可以随意更改其结构。

{
  "id": 1,
  "email": "email@email.com",
  "username": "myusername",
  "userdata": {
    "currency": "USD",
    "budget": 500,
    "showCategories": true,
    "showLocations": true,
    "showSources": true
  }
}