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 - 将序列化器字段映射到数据库列名