【问题标题】:Return data contained in two different models in django rest framework返回django rest框架中两个不同模型中包含的数据
【发布时间】:2017-07-23 16:59:20
【问题描述】:

我有两个模型,一个用户模型和一个配置文件模型。我使用用户 ID 作为配置文件模型的外键。

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 实例上的任何属性或键都不匹配。 原始异常文本是:“用户”对象没有属性“用户”。

我在这里做错了什么?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    首先,在 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。

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 1970-01-01
      • 2016-05-30
      • 2018-06-02
      • 2017-08-21
      • 2013-09-13
      • 2020-09-13
      • 2022-08-16
      • 2017-06-04
      相关资源
      最近更新 更多