2017-01-20 43 views
0

我有这样的模式:Django的DRF左加入

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名称的正确方法。

我缺少什么?

回答

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',) 
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,但它给你作为一个潜在的更好的方法的引用)