django drf左连接

django drf左连接,django,foreign-key-relationship,django-rest-framework,Django,Foreign Key Relationship,Django Rest Framework,我有这个模型: class Env(models.Model): env_name = models.CharField(max_length=100, unique=True) is_enabled = models.CharField(max_length=1, choices=ENABLED, default='Y') def __unicode__(self): return unicode(self.env_name) 我也有这个模型 cla

我有这个模型:

class Env(models.Model):
    env_name = models.CharField(max_length=100, unique=True)
    is_enabled = models.CharField(max_length=1, choices=ENABLED, default='Y')

    def __unicode__(self):
        return unicode(self.env_name)
我也有这个模型

class Hosts(models.Model):
    host_name = models.CharField(max_length=200, unique=True)
    host_variables = jsonfield.JSONField()
    host_env = models.ForeignKey(Env, models.DO_NOTHING, related_name='host_env')
我希望有一个相当于连接的序列化表示

我正在尝试获取包含
host\u name
env\u name

我似乎找不到正确的方法来序列化它

我很高兴到目前为止

class HostSerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
    model = Hosts
    fields = ('host_name', 'ip_address', 'is_enabled','is_managed','managed_users')
我似乎找不到在我的主机结果的每一行中获取环境名称的正确方法


我遗漏了什么?

序列化程序只处理单个模型,因此您要添加的任何其他内容都必须显式添加

如果您只想添加环境名称,可以使用如下
SerializerMethodField
字段:

class HostSerializer(serializers.HyperlinkedModelSerializer):
  env_name = serializers.SerializerMethodField()
  class Meta:
    model = Hosts
    fields = ('host_name', 'env_name', 'ip_address', 'is_enabled','is_managed',
              'managed_users',)

    def get_env_name(self, obj):
        host_env = obj.host_env
        if host_env:
            return str(host_env.env_name)
        return None
请注意,您可能还希望查看嵌套序列化程序,但这会产生如下结果:

{
    'host_name': 'my host name',
    'host_env': {
        'env_name': 'My env name'
    }
}

请参阅(不要解释这不是您的OP,而是将其作为一种可能更好的方法的参考)

序列化程序只处理单个模型,因此您要添加的任何其他内容都必须显式添加

如果您只想添加环境名称,可以使用如下
SerializerMethodField
字段:

class HostSerializer(serializers.HyperlinkedModelSerializer):
  env_name = serializers.SerializerMethodField()
  class Meta:
    model = Hosts
    fields = ('host_name', 'env_name', 'ip_address', 'is_enabled','is_managed',
              'managed_users',)

    def get_env_name(self, obj):
        host_env = obj.host_env
        if host_env:
            return str(host_env.env_name)
        return None
请注意,您可能还希望查看嵌套序列化程序,但这会产生如下结果:

{
    'host_name': 'my host name',
    'host_env': {
        'env_name': 'My env name'
    }
}
请参阅(不要解释这不是您的OP,而是提供给您作为参考,以获得可能更好的方法)

您可以尝试

class HostSerializer(serializers.HyperlinkedModelSerializer): 
    env_name = serializers.ReadOnlyField(source='host_env.env_name')
    class Meta: 
        model = Hosts 
        fields = ('host_name', 'ip_address', 'is_enabled','is_managed','managed_users', 'env_name',)
你可以试试

class HostSerializer(serializers.HyperlinkedModelSerializer): 
    env_name = serializers.ReadOnlyField(source='host_env.env_name')
    class Meta: 
        model = Hosts 
        fields = ('host_name', 'ip_address', 'is_enabled','is_managed','managed_users', 'env_name',)