使用序列化程序

时间:2016-02-02 01:48:00

标签: django django-rest-framework

在查看文档一段时间后,我找不到一个非常好的方法来聚合序列化程序中模型的计数。

这方面的一个例子可能是在许多网站上进行的标准上/下投票。

class PostSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    up_vote = serializers.SerializerMethodField('cast_up_vote', write_only=True)
    down_vote = serializers.SerializerMethodField('cast_down_vote', write_only=True)
    votes = serializers.SerializerMethodField()

有模特:

class Post(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    up_votes = models.IntegerField(default=0)
    down_votes = models.IntegerField(default=0)

假设我们想要使用up_vote设置对帖子执行更新。您想要将up_votes递增一。什么是正确的方法去做?我目前正在尝试使用SerializerMethodFields,但我没有太多运气使用传入数据中的数据属性。我也认为serializerMethodField可能是错误的方法,因为它似乎在从模型到表示更有用。

如果需要更多信息,请随时发表评论,如果有答案,我即将调查自定义字段。

2 个答案:

答案 0 :(得分:0)

您使用SerializerMethodField但没有为其编写任何方法。如果使用SerializerMethodField,则必须在Serializer中编写SerializerMethodField指向的方法。您可以通过该方法中的'obj'到达被序列化的对象。

示例:

class PostSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    up_vote = serializers.SerializerMethodField('cast_up_vote', write_only=True)
    down_vote = serializers.SerializerMethodField('cast_down_vote', write_only=True)
    votes = serializers.SerializerMethodField()

    def  cast_up_vote(self, obj):
        obj.up_vote += 1
        obj.save()

请提供错误回溯,以便我们可以提供更好的帮助。

答案 1 :(得分:0)

您可以使用class属性执行此类要求。只需编写一个名称为Gen.filter的函数,如下所示,框架就会将它们链接起来。

Dim i1 As New MenuItem("&Edit")
Dim i2 As New MenuItem("&Delete")

Private Sub ContextMenuHandler(ByVal Sender As Object, ByVal e As EventArgs)
    Dim mi As MenuItem = DirectCast(sender, MenuItem)

    Select Case mi.Text.ToLower()
        Case "edit"
            ListViewToText()
        Case "delete"
            Try
                If ListView1.SelectedItems.Count > 0 Then
                    ListView1.Items.Remove(ListView1.SelectedItems(0))
                End If
            Catch ex As Exception

            End Try
    End Select

结果:

get_<field_name>