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_name
和 env_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',)
我有这个型号:
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')
我似乎找不到在我的主机结果的每一行中获取环境名称的正确方法。
我错过了什么?
一个序列化器只处理一个模型,所以你想添加的任何其他东西都必须显式添加。
如果您只想添加 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',)