序列化程序 returns 对象而不是字段
Serializer returns object instead fields
使用 Django 2.1/Django Rest 框架。
我正在接收 DRF 的模型对象输出,而不是实际字段。
我想收到 audio_links 和 release_artists 表格的所有项目。
这是我的。
输出
{
"title": "Attack The Dancefloor Volume Two",
"audiolinks": [
"AudioLinks object (55708)",
"AudioLinks object (55709)",
"AudioLinks object (55710)",
"AudioLinks object (55711)"
],
"releaseartists": [
"ReleaseArtists object (140)",
"ReleaseArtists object (141)"
]
}
models.py
class AudioLinks(models.Model):
release = models.ForeignKey('ReleasesAll', models.DO_NOTHING, db_column='release_id', related_name='audiolinks')
track_number = models.IntegerField()
class Meta:
managed = False
db_table = 'audio_links'
class ReleaseArtists(models.Model):
release = models.ForeignKey('ReleasesAll', models.DO_NOTHING, db_column='release_id', related_name='releaseartists')
artists = models.CharField(max_length=100)
class Meta:
managed = False
db_table = 'release_artists'
views.py
class ListReleaseDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = ReleasesAll.objects.all()
serializer_class = ReleasesSerializer
def get(self, request, *args, **kwargs):
try:
a_release = self.queryset.prefetch_related('releaseartists','audiolinks').get(pk=kwargs['release_id'])
return Response(ReleasesSerializer(a_release).data)
except ReleasesAll.DoesNotExist:
return Response(
data = {
"message": "{} does not exist".format(kwargs["release_id"])
},
status=status.HTTP_404_NOT_FOUND
)
serializers.py
class ReleasesSerializer(serializers.ModelSerializer):
audiolinks = serializers.StringRelatedField(many=True)
releaseartists = serializers.StringRelatedField(many=True)
class Meta:
model = ReleasesAll
fields = ('title','audiolinks','releaseartists')
serializers.stringRelatedField
给出模型上定义的 __str__
方法的输出。
因此你得到这个“AudioLinks object (55708)
”和 ReleaseArtists object (141)
,这是任何模型的默认 __str__
表示。
为了获取所有字段,您必须为与所需字段相关的每个其他模型定义序列化程序,例如:
class AudioLinksSerializer(serializers.ModelSerializer):
class Meta:
model = AudioLinks
fields = ('__all__')
class ReleaseArtistsSerializer(serializers.ModelSerializer):
audiolinks = serializers.StringRelatedField(many=True)
releaseartists = serializers.StringRelatedField(many=True)
class Meta:
model = ReleaseArtists
fields = ('__all__')
然后:
class ReleasesSerializer(serializers.ModelSerializer):
audiolinks = AudioLinksSerializer(many=True)
releaseartists = ReleaseArtistsSerializer(many=True)
class Meta:
model = ReleasesAll
fields = ('title','audiolinks','releaseartists')
这足以让您获取所有字段。
***而且根据 Django 惯例,您需要以单数形式命名模型,即 AudioLink
、ReleaseArtist
。这样您就可以将模型视为单个对象。当您尝试获得 audiolinks
时会更容易,因为您会想 "there are many AudioLink objects and I am getting few of them"
使用 Django 2.1/Django Rest 框架。
我正在接收 DRF 的模型对象输出,而不是实际字段。
我想收到 audio_links 和 release_artists 表格的所有项目。
这是我的。
输出
{
"title": "Attack The Dancefloor Volume Two",
"audiolinks": [
"AudioLinks object (55708)",
"AudioLinks object (55709)",
"AudioLinks object (55710)",
"AudioLinks object (55711)"
],
"releaseartists": [
"ReleaseArtists object (140)",
"ReleaseArtists object (141)"
]
}
models.py
class AudioLinks(models.Model):
release = models.ForeignKey('ReleasesAll', models.DO_NOTHING, db_column='release_id', related_name='audiolinks')
track_number = models.IntegerField()
class Meta:
managed = False
db_table = 'audio_links'
class ReleaseArtists(models.Model):
release = models.ForeignKey('ReleasesAll', models.DO_NOTHING, db_column='release_id', related_name='releaseartists')
artists = models.CharField(max_length=100)
class Meta:
managed = False
db_table = 'release_artists'
views.py
class ListReleaseDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = ReleasesAll.objects.all()
serializer_class = ReleasesSerializer
def get(self, request, *args, **kwargs):
try:
a_release = self.queryset.prefetch_related('releaseartists','audiolinks').get(pk=kwargs['release_id'])
return Response(ReleasesSerializer(a_release).data)
except ReleasesAll.DoesNotExist:
return Response(
data = {
"message": "{} does not exist".format(kwargs["release_id"])
},
status=status.HTTP_404_NOT_FOUND
)
serializers.py
class ReleasesSerializer(serializers.ModelSerializer):
audiolinks = serializers.StringRelatedField(many=True)
releaseartists = serializers.StringRelatedField(many=True)
class Meta:
model = ReleasesAll
fields = ('title','audiolinks','releaseartists')
serializers.stringRelatedField
给出模型上定义的 __str__
方法的输出。
因此你得到这个“AudioLinks object (55708)
”和 ReleaseArtists object (141)
,这是任何模型的默认 __str__
表示。
为了获取所有字段,您必须为与所需字段相关的每个其他模型定义序列化程序,例如:
class AudioLinksSerializer(serializers.ModelSerializer):
class Meta:
model = AudioLinks
fields = ('__all__')
class ReleaseArtistsSerializer(serializers.ModelSerializer):
audiolinks = serializers.StringRelatedField(many=True)
releaseartists = serializers.StringRelatedField(many=True)
class Meta:
model = ReleaseArtists
fields = ('__all__')
然后:
class ReleasesSerializer(serializers.ModelSerializer):
audiolinks = AudioLinksSerializer(many=True)
releaseartists = ReleaseArtistsSerializer(many=True)
class Meta:
model = ReleasesAll
fields = ('title','audiolinks','releaseartists')
这足以让您获取所有字段。
***而且根据 Django 惯例,您需要以单数形式命名模型,即 AudioLink
、ReleaseArtist
。这样您就可以将模型视为单个对象。当您尝试获得 audiolinks
时会更容易,因为您会想 "there are many AudioLink objects and I am getting few of them"