在查看文档一段时间后,我找不到一个非常好的方法来聚合序列化程序中模型的计数。
这方面的一个例子可能是在许多网站上进行的标准上/下投票。
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可能是错误的方法,因为它似乎在从模型到表示更有用。
如果需要更多信息,请随时发表评论,如果有答案,我即将调查自定义字段。
答案 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>