【问题标题】:How to write flat and read nested from ModelSerializer in Django Rest Framework? [duplicate]如何在 Django Rest Framework 中从 ModelSerializer 编写平面和嵌套读取? [复制]
【发布时间】:2016-04-22 19:51:06
【问题描述】:

我需要实现一个功能,即在撰写帖子时需要提交帐户 ID,并在阅读帖子时读取帐户的附加信息。如何写入深度为一的数据但读取深度更深的数据?

模型序列化器:

class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(required=False, allow_null=True)
    class Meta:
        model = Post
        fields = ('id', 'author', 'message', 'rating', 'create_date', 'close_date',)

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

【问题讨论】:

  • 你能发布你尝试过的东西吗?
  • 我已经更新了模型序列化器。

标签: python django django-rest-framework


【解决方案1】:

据我所知,您希望您的某些字段是只读的,例如您需要读取“create_date”但不能写入

这是我的方法:

models.py

# This extra modification done as late comments 
class Post(models.Model):
  ...
  def username(self):
     return self.author.username

  def full_name(self):
     return self.author.full_name

序列化器.py

class PostSerializer(serializers.ModelSerializer):
    # author = UserSerializer(required=False, allow_null=True)  # Don't define this
    create_date_read_only = serializers.DateTimeField(required = False, read_only = True, source = 'create_date')
    class Meta:
        model = Post
        # username, full_name added to fileds tuple
        fields = ('id', 'author', 'username','full_name','message', 'rating', 'create_date_read_only', 'close_date',)

对其他只读文件执行相同操作

【讨论】:

  • 我后来提到了 read_only_fields 数组指定 create_date 和其他字段,它工作。我现在只需要在 PostSerializer 中使用的 UserSerializer 中读取 full_name 和 username 并且它在嵌套序列化器中不起作用。
  • 您是否已将作者声明为 Post 模型上的用户的 ForeignKey?
  • 是的..我使用作者作为用户模型的外键
  • 查看我的回答的最新修改
  • 我需要在读取期间返回嵌套在我的帖子数据中的用户数据。
【解决方案2】:

您可以为此使用SerializerMethodField

您不必修改模型。您的序列化程序如下所示:

class PostSerializer(serializers.ModelSerializer):
    my_username = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ('id', 'author', 'my_field'...)

    def get_my_username(self, obj):
        return obj.user.author.username

【讨论】:

  • 这错过了问题的“写平”部分,这只读取了平版。
猜你喜欢
  • 2021-02-06
  • 2014-10-08
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2014-11-09
相关资源
最近更新 更多