【问题标题】:Django REST Framework SerializerMethodField vs Django model methodsDjango REST Framework SerializerMethodField 与 Django 模型方法
【发布时间】:2020-04-23 01:46:50
【问题描述】:

在 Django REST Framework 中创建序列化程序时,我知道我可以创建一个 SerializerMethodField 来为模型创建一个新的只读方法。例如:

class AnswerSerializer(serializers.ModelSerializer):
    likes_count = serializers.SerializerMethodField()

    class Meta:
        model = Answer
        exclude = ["a_field"]

    def get_likes_count(self,instance):
        return instance.voters.count()

类似的事情也可以使用 models.py 文件中的属性或方法来完成:

class Answer(models.Model):

    @property
    def get_likes_count(self):
        return voters.count()

所以我的问题是:

各有什么优缺点?我知道 SerializerMethodField 用于只读操作,但除此之外不确定。

最好的做法是只保留模型字段的 models.py 文件,并使用信号进行更新/创建操作和序列化程序进行读取操作?

【问题讨论】:

  • 可以从类的任何实例访问模型上的属性,并且当属性是模型的一个完整属性并且可以/将要从多个不同的视图或序列化程序访问时非常有用。在序列化程序上定义它会将其限制为特定的序列化程序及其子类,如果您不打算将该属性用于其他任何地方,这将很有用

标签: django django-rest-framework django-serializer


【解决方案1】:

使用序列化器方法而不是@property 方法的一个优点是您可以在传递给序列化器的查询集上使用annotations

 AnswerSerializer(Answer.objects.annotate(likes_count=Count('voters')), many=True)

def get_likes_count(self, instance):
    return getattr(instance, 'likes_count', None) or instance.voters.count()

通过这种方式,您可以使用注释来减少您进行的查询次数,并有一个回退来计算值

【讨论】:

  • 我不知道注解,很方便。我应该注意,我使用“count”示例只是为了简单起见——当前项目的实际方法要复杂得多。
猜你喜欢
  • 2016-07-21
  • 2016-09-25
  • 2019-05-12
  • 2016-05-23
  • 2018-07-13
  • 2014-09-08
  • 2019-01-07
  • 1970-01-01
  • 2021-06-23
相关资源
最近更新 更多