2013-03-14 13 views
10

Django-REST çerçeve belgelerinin bulunması, ne kadar uzun olsa da, benim için arka planda hala çok açık olmasına rağmen.Django-REST çerçevesi restore_object attrs parametreleri

Restore_object yönteminin attrs işlevi ne yapar?

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

İkinci argüman ne anlama geliyor ve bu dokümanlar gelecekte ne anlama geleceğini arayan hakkında gitmek ? Ayrıca return Snippet(**attrs)'daki çift yıldız işaretlerinin ne anlama geldiğinden emin değilsiniz. Bu, keywArgs'den farklı mı? Serileştirilmiş Snippet nesnesine hangi argümanlar geri döndürülüyor?

Dokümanların başka bir bölümünde, geri dönüşümü görebileceğimi umduğum restore_object() instance.title = attrs['title']'da görüyorum. ...

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

Ben aynı şeyi merak ediyorum. – alejoss

cevap

6

teşekkür Bunu daha açık hale getirmek için bir amaç biraz belgelerine güncelledik

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

yöntem şimdi okur ...

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 stili Python'un s tandard anahtar kelime genişletme. İyi bir açıklama için here'a bakın.

Yardımcı olur Snippet(title=attrs['title'], code=attrs['code'], ...)

Umut eşdeğeri olarak bitireceğiz!

+1

Merhaba Tom, harika bir çerçeve. Çok genç görünüyorsun, ama sanırım bütün bu ninjalar bu günlerde. Geriye doğru bakıldığında, ** attr çok açık, Python'daki maceralarımda bunu bilmiyordum. Hepsi çok açık bir şekilde belgelenmiş, bunu Google'da aramak biraz zordu. Belgelerin Python ve Django'yu öğretmek zorunda olmadığını biliyorum, bu kapsam dışı. Ama eklenmiş yorumları yapmak, benim gibi insanlara yardımcı olur. Eminim. – user798719

+0

Merhaba Tom, iç içe serilaştırıcılar için attrs.get() işlevini nasıl kullanıyorsunuz? – user1876508

+0

Merhaba Tom, benim örneğim Yok'a eşit olduğu zaman olduğu gibi, benim için ne kadar ayrıntıya girdiğinizi açık değil mi? –

2

DRF 3.0+ sürümünde restore_object yöntemi kaldırıldı. Şimdi iki ayrı yöntem kullanabilirsiniz: .create ve

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) 

Yayın notları .update: http://www.django-rest-framework.org/topics/3.0-announcement/