2017-03-03 83 views
0

我有两种模型:用户模型和配置文件模型。我正在使用用户标识作为配置文件模型的外键。在Django rest框架中返回两个不同模型中包含的数据

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE,primary_key=True) 
    bio = models.TextField(max_length=500, blank=True) 
    website = models.TextField(max_length=200, blank=True) 
    phoneno = models.TextField(max_length=200, blank=True) 
    gender = models.TextField(max_length=200, blank=True) 
    avatar = models.ImageField('profile picture', upload_to='images/avatar/', default='/images/avatar/blank.png') 

我使用的是内置Django在用户模型包含的用户名,密码等领域...

我想创建一个串行其中我可以返回这两个配置文件的详细信息和用户模型。到目前为止,如果我使用UserSerializer而不是下面的ProfileUserCombinedSerializer,我可以返回用户的详细信息。

但是我已经创建ProfileUserCombinedSerializer,这样我可以将二者结合起来的值,到目前为止,我有以下

class UserSeralizer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = User 
     fields = ('username', 'password',"email","first_name","last_name") 


class ProfileUserCombinedSerializer(serializers.HyperlinkedModelSerializer): 
    user = ProfileSerializer() 
    class Meta: 
     model = User 
     fields = ('username',"user") 

如何相应的剖面模型追加到查询集,这样的对应领域生物,网站等得到序列化,所以我可以查看他们在可浏览的api。

class returnProfileDetailsFromUser(generics.ListAPIView): 
    serializer_class = ProfileUserCombinedSerializer 
    def get_queryset(self): 
     i = self.kwargs['id'] 
     queryset = User.objects.all() 
     queryset = queryset.filter(id=i) 
     return queryset 

现在,我最终得到了以下错误:试图在串行ProfileUserCombinedSerializer得到现场user值时

了AttributeError的。 串行器字段可能命名错误,并且不匹配User实例上的任何属性或密钥。 原始异常文本是:'用户'对象没有属性'用户'。

我在这里做错了什么?

回答

0

首先在Django rest框架中,您必须在模型中使用相关名称。重写型号为:

models.py

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE,primary_key=True, related_name = 'user_profile') 

serializer.py

class ProfileUserCombinedSerializer(serializers.ModelSerializer): 
    user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), required=False) 
    class Meta: 
     model = Profile 
     fields = ("user","bio",) 

class UserSeralizer(serializers.ModelSerializer): 
    user_profile = ProfileSerializer() 
    class Meta: 
     model = User 
     fields = ('username', 'password',"email","first_name","last_name","user_profile",) 

然后在你的意见致电UserSeralizer和发送的用户ID。

+0

工程很好,谢谢! – blaziken105

相关问题