Django Rest:基于多个查询集的序列化器
Posted
技术标签:
【中文标题】Django Rest:基于多个查询集的序列化器【英文标题】:Django Rest: Serializers Based on Multiple Querysets 【发布时间】:2017-11-02 22:18:00 【问题描述】:我正在使用链接描述的序列化程序:Serializer relations (section PrimaryKeyRelatedField)
我的需求略有不同,我相信这真的很简单。
class Album(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks')
order = models.IntegerField()
title = models.CharField(max_length=100)
duration = models.IntegerField()
class SomeWidget(models.Model):
album = models.ForeignKey(Album)
track = models.ForeignKey(Track)
name = models.CharField(max_length=100)
description = models.CharField(max_length=100)
我的需要,我需要返回以下内容:
'album_name': 'Things We Lost In The Fire',
'artist': 'Low',
'tracks': [
'1: Sunflower',
'2: Whitetail',
'3: Dinosaur Act',
...
],
'widget': [
'id': '1234',
'name': 'my widget',
'description': 'my description'
]
我正在尝试:
class WidgetField(serializers.RelatedField):
def to_representation(self, value):
return
'id': '1234'
....
class TrackListingField(serializers.RelatedField):
def to_representation(self, value):
...
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackListingField(many=True)
widget = WidgetField()
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
我不断收到错误:
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.
谢谢
【问题讨论】:
【参考方案1】:好的,知道了。这需要一点谷歌搜索/反复试验。显然,您可以覆盖返回字段数据的函数。
例如:
class AlbumSerializer(serializers.ModelSerializer):
widget = serializers.SerializerMethodField()
def get_widget(self, data):
return
'id': data.id
或者,您可以执行以下操作:
class WidgetSerializer(serializers.ModelSerializer):
class Meta:
model = Widget
fields = ('id', 'name', 'description',)
....在 AlbumSerializer.get_widget 函数中:
def get_widget(self, data):
widget = Widget.objects.get(album=data.album, track=data.track)
return WidgetSerializer(widget, many=False, context=self.context).data
最后,你没有有使用函数名“get_widget”。你可以随意命名它。示例:
class AlbumSerializer(serializers.ModelSerializer):
widget = serializers.SerializerMethodField("fn_override")
def fn_override(self, data):
....
您可以遵循这个 SO 问题中的模式:Django REST Framework: adding additional field to ModelSerializer
【讨论】:
以上是关于Django Rest:基于多个查询集的序列化器的主要内容,如果未能解决你的问题,请参考以下文章
Django Rest Framework-----序列化详解(serializers)
基于Django的Rest Framework框架的序列化组件
1个模型的django-rest-framework多个序列化器?