Django REST Framework 中的外键值

Posted

技术标签:

【中文标题】Django REST Framework 中的外键值【英文标题】:Foreign key value in Django REST Framework 【发布时间】:2015-03-27 20:08:01 【问题描述】:

models.py:

class Station(models.Model):
    station = models.CharField()

class Flat(models.Model):
    station = models.ForeignKey(Station, related_name="metro")
    # another fields

然后在serializers.py中:

class StationSerializer(serializers.ModelSerializer):
    station = serializers.RelatedField(read_only=True)

    class Meta:
        model = Station


class FlatSerializer(serializers.ModelSerializer):
    station_name = serializers.RelatedField(source='station', read_only=True)

    class Meta:
        model = Flat
        fields = ('station_name',)

我有一个错误:

NotImplementedError:必须实现RelatedField.to_representation()。 如果您从 REST 框架版本 2 升级,您可能需要ReadOnlyField。 我读了this,但它对我没有帮助。 如何解决这个问题? 谢谢!

【问题讨论】:

为什么要使用相关字段作为 Station.station 字段?当然应该是 CharField。 @DanielRoseman 和station = serializers.CharField(read_only=True) 有同样的问题 【参考方案1】:

RelatedField 是所有处理关系的字段的基类。通常你不应该使用它,除非你将它子类化为一个自定义字段。

在您的情况下,您甚至根本不需要相关字段。您只是在寻找一个只读的单个外键表示,因此您可以只使用 CharField

class StationSerializer(serializers.ModelSerializer):
    station = serializers.CharField(read_only=True)

    class Meta:
        model = Station


class FlatSerializer(serializers.ModelSerializer):
    station_name = serializers.CharField(source='station.name', read_only=True)

    class Meta:
        model = Flat
        fields = ('station_name', )

您似乎还想要FlatSerializer 中的Station 对象的name。您应该让 source 指向确切的字段,所以我为您将其更新为 station.name

【讨论】:

谢谢!这似乎是最新的实现。

以上是关于Django REST Framework 中的外键值的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-framework:如何更新嵌套的外键?我的更新方法甚至没有被调用

Django REST Framework - 发布包含自然键的外键字段?

在 GET 中隐藏密码字段,但在 Django REST Framework 中隐藏密码字段,其中序列化程序中的 depth=1

Django Rest Framework - 将序列化器字段映射到数据库列名

Django Rest Framework 中嵌套 URL 的相关资源

如何更改 django-rest-framework 的 authtoken 中的现有令牌?