2016-02-05 211 views
1

在我serializers.py我可以这样做:Django Rest Framework中的序列化器字段过滤?

class BoxSerializer(serializers.ModelSerializer): 
    user = serializers.ReadOnlyField(source='user.email') 
    playlist = PrimaryKeyRelatedField(allow_null=True, source='playlist.name', 
     queryset=Playlist.objects.all(), required=False) 

    class Meta: 
     model = Box 

我甚至可以做这样的事情(硬编码,但工程):

playlist = PrimaryKeyRelatedField(allow_null=True, source='playlist.name', 
      queryset=Playlist.objects.filter(user=User.objects.get(id=4)), required=False) 

我在这个新的,我想知道如果有一种方法,我可以通过一些方法或东西会做这样的事情request.user:

(我知道这是不正确,这只是用来了解我的点):

playlist = PrimaryKeyRelatedField(allow_null=True, source='playlist.name', 
      queryset=Playlist.objects.filter(user=request.user), required=False) 

或者,我可以做这样的事情(同样不正确的):

playlist = PrimaryKeyRelatedField(allow_null=True, source='playlist.name', 
     queryset='get_playlists', required=False) 

def get_playlists(self): 
    user = self.context['request'].user 
    return Playlist.objects.filter(user=user) 
+0

Box的“用户”是否应该与播放列表的“用户”相同? – Mijamo

回答

3

试试这个:

class BoxSerializer(serializers.ModelSerializer): 
    # ... 

    def __init__(self, *args, **kwargs): 
     user = kwargs['context']['request'].user 

     super(BoxSerializer, self).__init__(*args, **kwargs) 
     self.fields['playlist'].queryset = Playlist.objects.filter(user=user) 
+0

ty,这工作像一个魅力 –

0

这可能工作:

class UserSerializer(serializer.ModelSerializer): 
    email = serializes.EmailField() 
    playlists = serializers.PrimaryKeyRelatedField(many=True, read_only=True) 
    box = serializer.PrimaryKeyRelatedField(read_only=True) 

    class Meta: 
     model = User 

根据您的模型及其关系,您将不得不使用某种形式的嵌套序列化器和/或相关字段。它可能不会全部适合于一个SerializerRead more about Serializers and there relationships in the docs

相关问题