2013-03-14 10 views
10

Trovare la documentazione del framework Django-REST per essere, nonostante quanto sia lunga, ancora troppo leggera sullo sfondo per me.Struttura Django-REST restore_object parametri attrs

Cosa fa la funzione attrs del metodo restore_object?

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

Cosa significa il secondo argomento per, e come potrei fare per ricerca di ciò che questo significherebbe in futuro nella documentazione?

Inoltre non so cosa significhi il doppio asterisco in return Snippet(**attrs). Questo è diverso da ** keywArgs? Quali argomenti vengono passati all'oggetto Snippet deserializzato?

In un'altra sezione dei documenti, vedo in restore_object() instance.title = attrs['title'] che spero uno possa vedere la mia confusione.

grazie

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

mi chiedevo la stessa cosa. – alejoss

risposta

6

Ho aggiornato la documentazione leggermente l'obiettivo di rendere più chiaro che ...

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

Il metodo ora legge ...

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) 

Lo stile **attrs utilizza Python's espansione della parola chiave tandard. Vedere here per una buona spiegazione.

va a finire come l'equivalente di Snippet(title=attrs['title'], code=attrs['code'], ...)

Speranza che aiuta!

+1

Ciao Tom, ottimo quadro. Sembri così giovane, ma immagino sia quello che sono tutti i ninja in questi giorni. In retrospettiva, il ** attrs è molto ovvio, non lo sapevo proprio nelle mie avventure in Python. È tutto molto chiaramente documentato, è stato un po 'difficile da cercare in Google. So che la documentazione non ha bisogno di insegnare alle persone Python e Django, che è fuori portata. Ma fare i commenti aggiunti aiuta persone come me ne sono sicuro. – user798719

+0

Ciao Tom, come usi attrs.get() per serializzatori nidificati? – user1876508

+0

Ciao Tom, non mi è chiaro come quando l'istanza sarà uguale a None, come pure non è chiaro quale istanza è possibile elaborare? –

2

In DRF 3.0+ il metodo restore_object è stato rimosso. Ora è possibile utilizzare due metodi separati: .create e .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) 

Note di rilascio: http://www.django-rest-framework.org/topics/3.0-announcement/

Problemi correlati