2017-01-20 45 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,但它給你作爲一個潛在的更好的方法的引用)