【问题标题】:DRF Serializer - How to return field of a foreign key?DRF 序列化器 - 如何返回外键字段?
【发布时间】:2019-04-29 11:38:27
【问题描述】:

早上好,

我真的在努力解决从我的 Django Rest Framework API 返回值的问题。

我有两个模型,SirTarget 和 Status。 SirTarget 就像一张工单,而 Status 是工单的文本状态标签,对应于处理工单的阶段。

型号如下:

class Status(models.Model):
     status_text = models.CharField(max_length=20)
     status_open = models.BooleanField(default=1)

     def __str__(self):
        return self.status_text


 class SirTarget(models.Model):
     name = models.CharField(max_length=70)
     entry_date = models.DateTimeField(auto_now_add=True)
     last_name = models.CharField(max_length=40)
     first_name = models.CharField(max_length=40)
     sir_status = models.ForeignKey(Status, on_delete=models.CASCADE, default=1, related_name='targets')

     def __str__(self):
        return '%d - %s %s' % (self.id, self.first_name, self.last_name)

我的序列化器如下所示:

 class SirTargetStatusSerializer(serializers.ModelSerializer):
     status_text = serializers.ReadOnlyField(source='Status.status_text')

     class Meta:
         model = SirTarget
         fields = '__all__'

字段 status_text 不会作为 API 调用的一部分返回。当我返回数据时,我收到了Status表的PK(1,2,3等),但我没有收到status_text字段。

我已经搞砸了一段时间并苦苦挣扎。我在这篇文章中引用了类似的设置: Retrieving a Foreign Key value with django-rest-framework serializers

但是,似乎没有什么对我有用。

编辑

我也试过了:

status_text = serializers.RelatedField(source='sir_status.status_text', read_only=True)

status_text = serializers.CharField(source='sir_status.status_text', read_only=True)

当我直接查看数据库时,我看到了我正在寻找的内容并验证了这些值是否按预期填充:

# select * from sir_admin_status;
 id |  status_text   | status_open 
----+----------------+-------------
  1 | New            | t
  2 | Open           | t
  3 | Referred       | f
  4 | Resolved       | f
  5 | False Positive | f

DRF 3.9.0 Python 3.7.1

感谢您的帮助。

BCBB

【问题讨论】:

  • Tom(DRF 的实际作者)在该链接答案中给出的答案究竟有什么问题?他正在使用相关字段。你为什么不呢?
  • RelatedField 仍然没有返回它。 CharField 也不是。

标签: django django-rest-framework


【解决方案1】:

你应该这样做

class SirTargetStatusSerializer(serializers.ModelSerializer):
     status_text = serializers.CharField(source='sir_status.status_text', read_only=True)

     class Meta:
         model = SirTarget
         fields = ('name', ... , 'status_text') # explicitly define all field you want here

【讨论】:

  • 好的,我想通了。 ReadOnlyField 没有工作,我在试图弄清楚时搞砸了一些其他的事情。一旦我取消了这些更改。我按照建议尝试了 CharField,并按预期工作。谢谢!
【解决方案2】:

要访问外键表中的所有字段,请使用“深度”

class SirTargetStatusSerializer(serializers.ModelSerializer):

     class Meta:
         model = SirTarget
         fields = ('__all__')
         depth = 1

【讨论】:

  • 谢谢!一个更简单的方法,因为您可以根据需要使用 FK 字段,而不是指定每个字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2021-03-19
  • 1970-01-01
相关资源
最近更新 更多