使用外键创建模型并返回序列化的响应

时间:2019-02-23 04:22:52

标签: django-rest-framework

我正在尝试通过一个note请求创建一个新的POST,该请求看起来像这样:{content: "hello world", user: 1},响应如下:{ id: 1, content: "hello world", user: { id: 1, first_name: "Homer", last_name: "Simpson" }

在阅读了其他外键问题之后,我已经能够创建注释并获得类似以下内容的信息:{ id: 1, content: "hello world", user: 1 } 但我确实需要其他用户信息。

我尝试使用to_representation修改响应,如下所示:

class NotePOSTSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ('id', 'content', 'timestamp', 'user')

    def to_representation(self, instance):
        rep = super().to_representation(instance)

        """Convert `status` to human-readable."""
        rep['user'] = UserSerializer(id=rep['user'])

        return rep

但我收到此错误:TypeError: Object of type ModelState is not JSON serializable

这是我到目前为止所掌握的。预先感谢!

models.py

class Article(models.Model):
    id = models.PositiveSmallIntegerField('Article Id', null=True)
    title = models.CharField('Title', max_length=100)
    content = models.TextField('Description', blank=True, null=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

class Note(models.Model):
    id = models.PositiveSmallIntegerField('Note Id', null=True)
    content = models.TextField('Content', blank=True)
    timestamp = models.DateTimeField('Timestamp', auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

views.py

class ArticleListView(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()

class NoteListView(viewsets.ModelViewSet):
    serializer_class =NoteSerializer
    queryset = Note.objects.all()

    def get_serializer_class(self):

        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer_class()` method."
            % self.__class__.__name__
        )

        if self.request.method in ('POST', 'PUT'):
            return NotePOSTSerializer
        else:
            return self.serializer_class

serializers.py

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

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

    class Meta:
        model = Note
        fields = ('id', 'content', 'timestamp', 'user')

class NotePOSTSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ('id', 'content', 'timestamp', 'user')

class ArticleSerializer(serializers.ModelSerializer):
    notes = NoteSerializer(many=True, read_only=True)

    class Meta:
        model = Article
        fields = ('id', 'title', 'content', 'created', 'updated', 'notes')

1 个答案:

答案 0 :(得分:0)

我遇到了完全不同的错误,所以我只提供工作代码

def to_representation(self, instance):
    rep = super().to_representation(instance)

    rep['user'] = UserSerializer(instance=User.objects.get(pk=instance.user_id)).data
    # UserSerializer(instance=instance)
    return rep