django drf离开加入

时间:2017-01-20 03:38:16

标签: 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)

我也有这个模型......

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')

我似乎找不到在我的Hosts结果的每一行中获取env名称的正确方法。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

序列化程序只处理单个模型,因此必须明确添加要添加的任何其他内容。

如果您只想添加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,而是将其作为可能更好的方式参考)

答案 1 :(得分:1)

你可以尝试

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',)