2013-03-14 53 views
10

找到Django-REST框架文档,尽管它有多长,但对于我而言仍然太浅。Django-REST框架restore_object attrs参数

restore_object方法的attrs函数做了什么?

instance.title = attrs.get('title', instance.title) 

第二个参数代表什么,我将如何去寻找这将在文档中的未来意味着什么?

还不确定return Snippet(**attrs)的双星号是什么意思。这不同于** keywArgs?什么参数被传回到反序列化的Snippet对象?

在文档的另一部分,我看到了restore_object()instance.title = attrs['title'],我希望可以看到我的困惑。

谢谢

class SnippetSerializer(serializers.Serializer): 
    pk = serializers.Field() # Note: `Field` is an untyped read-only field. 
    title = serializers.CharField(required=False, 
            max_length=100) 
    code = serializers.CharField(widget=widgets.Textarea, 
           max_length=100000) 
    linenos = serializers.BooleanField(required=False) 
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, 
             default='python') 
    style = serializers.ChoiceField(choices=STYLE_CHOICES, 
            default='friendly') 

    def restore_object(self, attrs, instance=None): 
     """ 
     Create or update a new snippet instance. 
     """ 
     if instance: 
      # Update existing instance 
      instance.title = attrs.get('title', instance.title) 
      instance.code = attrs.get('code', instance.code) 
      instance.linenos = attrs.get('linenos', instance.linenos) 
      instance.language = attrs.get('language', instance.language) 
      instance.style = attrs.get('style', instance.style) 
      return instance 

     # Create new instance 
     return Snippet(**attrs) 
+0

我想知道同样的事情。 – alejoss 2014-10-14 16:39:46

回答

6

我在一个目标略微更新的说明文件,更明确的...

http://django-rest-framework.org/tutorial/1-serialization.html#creating-a-serializer-class

的方法现在读...

def restore_object(self, attrs, instance=None): 
    """ 
    Create or update a new snippet instance, given a dictionary 
    of deserialized field values. 

    Note that if we don't define this method, then deserializing 
    data will simply return a dictionary of items. 
    """ 
    if instance: 
     # Update existing instance 
     instance.title = attrs.get('title', instance.title) 
     instance.code = attrs.get('code', instance.code) 
     instance.linenos = attrs.get('linenos', instance.linenos) 
     instance.language = attrs.get('language', instance.language) 
     instance.style = attrs.get('style', instance.style) 
     return instance 

    # Create new instance 
    return Snippet(**attrs) 

**attrs样式是使用Python的s标准的关键字扩展。 请参阅here的一个很好的解释。

它最终会为Snippet(title=attrs['title'], code=attrs['code'], ...)

希望相当于帮助!

+1

嗨汤姆,伟大的框架。你看起来很年轻,但我想这就是那些日子里所有的忍者。回想起来,** attrs非常明显,我只是在Python中的冒险中不知道这一点。这一切都非常清晰地记录下来,在Google中搜索这些内容有点困难。我知道文档不需要教人Python和Django,这是超出范围。但是,增加评论确实有助于像我这样的人。 – user798719 2013-03-17 22:11:48

+0

嗨汤姆,你如何使用attrs.get()嵌套序列化器? – user1876508 2013-06-14 22:35:07

+0

嗨,汤姆,我不清楚,什么时候实例将等于无,以及它不清楚,你可以详细说明什么是实例? – 2014-01-07 09:07:01

2

在DRF 3.0+中,restore_object方法已被删除。现在你可以用两种不同的方法:.create和.update

def update(self, instance, validated_data): 
    instance.title = validated_data.get('title', instance.title) 
    instance.code = validated_data.get('code', instance.code) 
    instance.linenos = validated_data.get('linenos', instance.linenos) 
    instance.language = validated_data.get('language', instance.language)   
    instance.style = validated_data.get('style', instance.style) 
    instance.save() 
    return instance 

def create(self, validated_data): 
    return Snippet.objects.create(**validated_data) 

发行说明:http://www.django-rest-framework.org/topics/3.0-announcement/