django drf 左连接

django drf left join

我有这个型号:

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_nameenv_name

的行

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

我到目前为止...

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

我似乎找不到在我的主机结果的每一行中获取环境名称的正确方法。

我错过了什么?

一个序列化器只处理一个模型,所以你想添加的任何其他东西都必须显式添加。

如果您只想添加 env_name,您可以像这样使用 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'
    }
}

请参阅 http://www.django-rest-framework.org/api-guide/relations/#nested-relationships(不解释,因为那不是您的 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',)