簡體   English   中英

在Django Rest Framework中,如何限制通過RelatedField Serializer關系獲取的字段?

[英]In Django Rest Framework, how to restrict fields fetched with a RelatedField Serializer relation?

DRF文檔中的序列化器為例:

class AlbumSerializer(serializers.ModelSerializer):

    tracks = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='track-detail'
    )

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

當DRF執行查詢以獲取特定album所有track ,生成的SQL會選擇每個track所有列。 我如何將其限制為僅請求特定列,例如用於超鏈接的pk到響應中的每個軌道?

(為什么?因為可能會返回很多軌道,並且每個軌道在數據庫的行中都有很多數據,所以可能會返回很多不必要的數據。)

您可以使用SerializerMethodField來構建自己的queryset並使用value_list

class AlbumSerializer(serializers.ModelSerializer):

    tracks = serializers.SerializerMethodField()

    def get_tracks(self, instance):
        return TracK.objects.filter(album=self).values_list('id', flat=True)


    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

我認為這可以做到...

from rest_framework import serializers
from rest_framework.reverse import reverse

from myapp.models import Album


class AlbumSerializer(serializers.ModelSerializer):

    tracks = serializers.SerializerMethodField()

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

    def get_tracks(self, instance):
        "Returns a list of URLs for Tracks' API detail views"

        request = self.context.get('request')

        tracks = []

        for track in instance.tracks.values('pk'):
            tracks.append(reverse(
                                'track-detail',
                                kwargs={'pk': track['pk']},
                                request=request
                            ))

        return tracks

我們正在手動創建HyperlinkedRelatedField()的結果(將URL列表返回到軌道的API詳細信息頁面),但是使用queryset中的values()限制了從數據庫中獲取的數據。

假設track-detail URL模式的參數為pk

替換PrimaryKeyRelatedField()甚至更簡單。 替換上面的get_tracks()方法:

    def get_tracks(self, instance):
        "Returns a list of Track IDs"
        return instance.tracks.values_list('pk', flat=True)

感謝@jmny引導我使用SerializerMethodField()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM