简体   繁体   English

Django rest框架代表扁平化的嵌套对象

[英]Django rest framework represent flatten nested object

I have a parent and a one-to-one related child model and I would like to render the fields from the child flat in the parent representation ( read only ). 我有一个父级和一对一相关的子模型,我想在父级表示形式中将子级的字段呈现为平面( read only )。 Currently, I have achieved that with a custom to_representation implementation but that seems very involved and I wonder if there is no easier way to achieve this. 目前,我已经通过自定义to_representation实现实现了这一点,但是这似乎非常to_representation ,我想知道是否没有更简单的方法可以实现这一点。

It is made more complicated by the fact that my related model is connected via a property. 我的相关模型通过属性连接的事实使情况变得更加复杂。

So here is the concrete example: By default a related object would be rendered like: 因此,这是一个具体示例:默认情况下,一个相关对象将呈现为:

{
  parent_name:'Bob', 
  child:{
    name:'Alice'
  }
}

This is what I want and currently get with my to_representation : 这就是我想要的,目前与我的to_representation

{
  parent_name:'Bob',       
  child_name:'Alice'
}

My models look like this: 我的模型如下所示:

class ChildModel(models.Model):
    name = models.CharField(max_length=100, null=True)

class ParentModel(models.Model):
    name = models.CharField(max_length=100, null=True)
    _child = models.ForeignKey('ChildModel', null=True)

    @property
    def child(self):
        return self._most_recent_status

    @name.setter
    def child(self, value):
        self._child = value

Here are my serializers: 这是我的序列化器:

class FlatChildField(serializers.RelatedField):
    def to_representation(self, value):
        return value.name


class FlatParentSerializer(serializers.ModelSerializer):    
    parent_name = serializers.CharField(source='name', read_only=True)
    child_name = FlatChildField(source='_child', read_only=True)

    class Meta:
         model = Parent
         fields = ('name', 'child_name')

For a simpler solution to get a flat representation of related models I would be grateful. 对于一个更简单的解决方案来获得相关模型的统一表示,我将不胜感激。

For completeness, I would be interested to hear if there is a simpler solution for "normal" related models (ie not property model fields as well). 为了完整起见,我想听听是否有一种针对“常规”相关模型(即,也没有属性模型字段)的简单解决方案。 I was looking for the equivalent of the django model query syntax of related_model__field , but I cannot find that. 我一直在寻找的Django的模型查询语法相当于related_model__field ,但我无法找到。 Does that exist for django rest framework? django rest框架是否存在?

Many thanks 非常感谢

The simplest means would be to use source : 最简单的方法是使用source

class FlatParentSerializer(serializers.ModelSerializer):    
    parent_name = serializers.CharField(source='name', read_only=True)
    child_name =  serializers.CharField(source='_child.name', read_only=True)

    class Meta:
        model = Parent
        fields = ('name', 'child_name')

You can use SerializerMethodField , it saves you really a lot of work and it's so clean and trivial: 您可以使用SerializerMethodField ,它确实为您节省了很多工作,而且非常简洁:

class FlatParentSerializer(serializers.ModelSerializer):    
    parent_name = serializers.CharField(source='name', read_only=True)
    child_name =  serializers.SerializerMethodField('get_child_name')

    class Meta:
         model = Parent
         fields = ('name', 'child_name')

    def get_child_name(self, obj):
        return obj._child.name

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM