我不确定如何将数据从两个“嵌套”模型传递到端点。
我想在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
答案 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
}
}