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框架的序列化组件

Django:具有多个查询集的 jQuery 自动完成

1个模型的django-rest-framework多个序列化器?

django-rest-framework 序列化器在多个视图中的不同字段

我可以将单个 Django 模型字段拆分为多个 Django Rest Framework 序列化器字段吗?