我有这个型号:
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_name
和env_name
我似乎无法找到序列化的正确方法
我到目前为止......
class HostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Hosts
fields = ('host_name', 'ip_address', 'is_enabled','is_managed','managed_users')
我似乎找不到在我的Hosts结果的每一行中获取env名称的正确方法。
我错过了什么?
答案 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',)