Django请求框架'ManyRelatedField'对象在get_fields中修改queryset时没有属性'queryset'

awi*_*ery 8 django django-rest-framework

GET /api/stories/169/在StorySerializer中收到以下错误,注释如下:

AttributeError at /api/stories/169/
'ManyRelatedField' object has no attribute 'queryset'
Run Code Online (Sandbox Code Playgroud)

在检查对象后,我发现如果我改变了...

fields['feature'].queryset = fields['feature'].queryset.filter(user=user)
Run Code Online (Sandbox Code Playgroud)

fields['photos'].child_relation.queryset = fields['photos'].child_relation.queryset.filter(user=user)
Run Code Online (Sandbox Code Playgroud)

......它似乎有效.但是这种方法没有记录,我确信这不是正确的方法.

我有这些型号:

class Story(CommonInfo):
    user = models.ForeignKey(User)
    text = models.TextField(max_length=5000,blank=True)
    feature = models.ForeignKey("Feature", blank=True, null=True)
    tags = models.ManyToManyField("Tag")

class Feature(CommonInfo):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=50)

class Photo(CommonInfo):
    user = models.ForeignKey(User)
    image = ImageField(upload_to='photos')
    story = models.ForeignKey("Story", blank=True, null=True, related_name='photos', on_delete=models.SET_NULL)
Run Code Online (Sandbox Code Playgroud)

并且StorySerializer:

class StorySerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.CharField(read_only=True) 
    comments = serializers.HyperlinkedRelatedField(read_only=True, view_name='comment-detail', many=True)

    def get_fields(self, *args, **kwargs):
        user = self.context['request'].user
        fields = super(StorySerializer, self).get_fields(*args, **kwargs)

        ## Restrict the options that the user can pick to the Features
        ## and Photos that they own
        # This line works:
        fields['feature'].queryset = fields['feature'].queryset.filter(user=user)

        # This line throws the error:           
        fields['photos'].queryset = fields['photos'].queryset.filter(user=user)

        return fields

    class Meta:
        model = Story
        fields = ('url', 'user', 'text', 'comments', 'photos', 'feature', 'tags')
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我觉得这与ForeignKey关系的方向有关.

auv*_*ipy 0

您可以尝试drf-writable-nested package,而不是重写 get_fields 方法,这将有助于更轻松地序列化嵌套关系并更好地手动处理 orm 字段方向。