【问题标题】:django drf left joindjango drf 左加入
【发布时间】:2017-01-20 03:38:16
【问题描述】:

我有这个模型:

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 的名称。

我错过了什么?

【问题讨论】:

    标签: django foreign-key-relationship django-rest-framework


    【解决方案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,而是将其作为可能更好的方法的参考提供给您)

    【讨论】:

      【解决方案2】:

      你可以试试

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

      【讨论】:

        猜你喜欢
        • 2010-10-20
        • 2014-02-11
        • 2014-07-03
        • 2021-12-11
        • 2020-01-14
        • 2019-03-16
        • 2021-06-02
        • 1970-01-01
        • 2018-08-30
        相关资源
        最近更新 更多