Django REST 框架——如何将 ForeignKey 解析为实际值,而不是索引?

Posted

技术标签:

【中文标题】Django REST 框架——如何将 ForeignKey 解析为实际值,而不是索引?【英文标题】:Django REST Framework -- How to resolve ForeignKey to Actual Value, not index? 【发布时间】:2016-02-10 20:48:57 【问题描述】:

我有一个模型,例如:

class Job(models.Model):
    build = models.ForeignKey(Build, on_delete=models.PROTECT)
    name = models.CharField(blank=True, null=True)

还有一个观点

class JobViewSet(viewsets.ModelViewSet):
    queryset = Job.objects.all()
    serializer_class = JobSerializer

还有一个序列化器

class JobSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job

唯一的问题是当我访问 API 端点时,我收到了数据,但来自 Job 模型的 build 属性实际上是外键的整数。我想要那个键的实际值(这也是我的 Django 休息框架中的一个模型。

我进行了很多搜索,发现了一些有希望的文章,但是当我尝试各种事情时都没有得到正确的结果。我对 Django 还是很陌生...你们可以帮忙吗?

【问题讨论】:

【参考方案1】:

首先为Build 创建一个序列化器,例如:

class BuildSerializer(serializers.ModelSerializer):
    class Meta:
        model = Build

JobSerializer 中的下一个点赞:

class JobSerializer(serializers.ModelSerializer):
    build = BuildSerializer()
    class Meta:
        model = Job
        fields = ('name','build')

【讨论】:

是否需要fields = ('name','build')?如果有,有什么影响? @RichieEpiscopo 您正在向序列化程序添加自定义字段 (build),因此您需要在 fields 中提及,否则这将导致 AssertionError。如果您希望在模型序列化程序中使用默认字段的子集,您可以使用fields 来实现。在这里了解更多 -> django-rest-framework.org/api-guide/serializers/… 谢谢你,这行得通!我不相信fields 是必要的。我在文档中找不到该信息,我在没有明确指定 fields 的情况下尝试过它,它可以工作。 另外,这种方法是首选还是设置depth = 1 更好(如下面的答案)?谢谢! @RichieEpiscopo 对不起,你是对的。 fields 属性不是强制性的。但是如果你使用field 属性,那么你必须显式地设置你想要序列化的所有字段(对于自定义字段是强制性的)。关于depth=1,这取决于您的要求。将来如果您想自定义序列化(BuildSerializer)的完成方式,您需要自己定义字段,否则您可以使用depth=1【参考方案2】:

使用depth 属性。

class BuildSerializer(serializers.ModelSerializer):
    class Meta:
        model = Build
        depth = 1

【讨论】:

谢谢,这行得通!这种方法是“最佳实践”还是更好地为每个ForeignKey 指定序列化程序?两者都工作......【参考方案3】:

如果您想获取JobSerializer 中成员字段的所有属性,请使用depth 属性。

示例,构建模型的所有字段。如果您只想获取特定字段,

同样,用户模型的所有字段除了密码字段都必须为用户的外键指定一个序列化器。

【讨论】:

以上是关于Django REST 框架——如何将 ForeignKey 解析为实际值,而不是索引?的主要内容,如果未能解决你的问题,请参考以下文章