Django rest framework Django Rest:基于多个查询集的序列化程序

Django rest framework Django Rest:基于多个查询集的序列化程序,django-rest-framework,Django Rest Framework,我正在使用链接中描述的序列化程序: 我有一点不同的需求,我相信这很容易 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')

我正在使用链接中描述的序列化程序:

我有一点不同的需求,我相信这很容易

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 WidgetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Widget
        fields = ('id', 'name', '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`.

谢谢

好的,明白了。这需要一点谷歌搜索/反复试验。显然,您可以重写为字段返回数据的函数

例如:

class AlbumSerializer(serializers.ModelSerializer):
    widget = serializers.SerializerMethodField()

    def get_widget(self, data):
        return {
            'id': data.id
        }
或者,您可以执行以下操作:

{
    '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 WidgetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Widget
        fields = ('id', 'name', 'description',)
。。。。在AlbumSerializer.get_小部件函数中:

    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):
        ....
您可以遵循此问题中的模式: