Python Django Rest框架嵌套关系
我刚开始使用Django,我需要你的帮助 所以,我创建了一个这样的模型 型号.py 我的序列化程序: 序列化程序.py 我的看法: 视图.py 结果:Python Django Rest框架嵌套关系,python,django,django-rest-framework,Python,Django,Django Rest Framework,我刚开始使用Django,我需要你的帮助 所以,我创建了一个这样的模型 型号.py 我的序列化程序: 序列化程序.py 我的看法: 视图.py 结果: { "id": 5, "name": "Ryan", "alias": "R", "barangs": [ { "pegawai": 5, "nama_barang": "burjo", "harga_barang": "123
{
"id": 5,
"name": "Ryan",
"alias": "R",
"barangs": [
{
"pegawai": 5,
"nama_barang": "burjo",
"harga_barang": "1234"
},
问题:如何将pegawai字段从id更改为名称?像这样:
{
"id": 5,
"name": "Ryan",
"alias": "R",
"barangs": [
{
"pegawai": Ryan,
"nama_barang": "burjo",
"harga_barang": "1234"
},
我已经找到了一些解决方案,但没有任何效果,我不知道问题出在哪里,所以我需要你的指导。干杯。您可以使用DRF RelatedField更改序列化程序中的字段值:
class BarangSerializer(serializers.ModelSerializer):
pegawai = serializers.RelatedField(source='pegawai.name', read_only=True)
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
您可以使用DRF RelatedField更改序列化程序中的字段值:
class BarangSerializer(serializers.ModelSerializer):
pegawai = serializers.RelatedField(source='pegawai.name', read_only=True)
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
使用serializers.CharField
使用serializers.CharField
方法1
由于您在
模型中定义了\uu str\uu()
方法,因此您可以使用
更新-1 要在创建模型对象时解决问题,请重写
To_representation()
方法
class BarangSerializer(serializers.ModelSerializer):
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
def to_representation(self, instance):
rep = super().to_representation(instance)
rep['pegawai'] = instance.pegawai.name
return rep
方法1
由于您在
模型中定义了\uu str\uu()
方法,因此您可以使用
更新-1 要在创建模型对象时解决问题,请重写
To_representation()
方法
class BarangSerializer(serializers.ModelSerializer):
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
def to_representation(self, instance):
rep = super().to_representation(instance)
rep['pegawai'] = instance.pegawai.name
return rep
这件很有用。。但是当我尝试输入到Barang时,我得到了如下错误:AssertionError:The
.create()
方法默认情况下不支持可写点源字段。为序列化程序myapi.serializers.BarangSerializer
编写一个显式的.create()
方法,或在点源序列化程序字段上设置read\u only=True
。解决方案?解决了,谢谢!但是如果我想把所有的Pegawai都放到BarangSerializer中怎么办?既然你在原始帖子中提到的问题已经解决了,你应该。。谢谢这是我的作品。。但是当我尝试输入到Barang时,我得到了如下错误:AssertionError:The.create()
方法默认情况下不支持可写点源字段。为序列化程序myapi.serializers.BarangSerializer
编写一个显式的.create()
方法,或在点源序列化程序字段上设置read\u only=True
。解决方案?解决了,谢谢!但是如果我想把所有的Pegawai都放到BarangSerializer中怎么办?既然你在原始帖子中提到的问题已经解决了,你应该。。谢谢
class BarangSerializer(serializers.ModelSerializer):
pegawali=serializers.CharField(source="pegawali.name")
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
class BarangSerializer(serializers.ModelSerializer):
pegawai = serializers.StringRelatedField()
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
class BarangSerializer(serializers.ModelSerializer):
pegawai = serializers.CharField(source='pegawai.name')
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
class BarangSerializer(serializers.ModelSerializer):
class Meta:
model = Barang
fields = (
'pegawai',
'nama_barang',
'harga_barang',
)
def to_representation(self, instance):
rep = super().to_representation(instance)
rep['pegawai'] = instance.pegawai.name
return rep