【问题标题】:Django Rest: Serializers Based on Multiple QuerysetsDjango Rest:基于多个查询集的序列化器
【发布时间】: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`.

谢谢

【问题讨论】:

    标签: django-rest-framework


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-04-24
      • 2020-11-27
      • 2016-01-25
      • 2014-12-19
      • 2021-09-25
      • 1970-01-01
      • 2018-03-24
      • 2018-03-10
      • 2013-07-04
      相关资源
      最近更新 更多