2013-03-14 35 views
10

Znalezienie dokumentacji ramowej Django-REST, mimo długiego czasu, wciąż jest dla mnie zbyt lekkie.Django-REST framework restore_object Parametry attrs

Co robi funkcja attrs metody restore_object?

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

Co kryje się za drugim argumentem i jak powinienem szukać tego, co oznaczałoby to w przyszłości w dokumentach?

Także nie wiesz, co oznacza podwójna gwiazdka w kodzie return Snippet(**attrs). To różni się od ** keywArgs? Jakie argumenty są przekazywane z powrotem do obiektu Snippet zserializowanego?

W innej sekcji dokumentów widzę w restore_object() instance.title = attrs['title'], które mam nadzieję, że ktoś może zobaczyć moje zamieszanie.

dziękuję

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

zastanawiałem się dokładnie to samo. – alejoss

Odpowiedz

6

zaktualizowałem dokumentację nieznacznie w celu sprawiają, że bardziej jasne ...

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

Sposób teraz czyta ...

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) 

Styl **attrs używa języka Python rozszerzenie tandardowe słów kluczowych. Patrz: here, aby uzyskać dobre wyjaśnienie.

To będzie skończyć jako równowartość Snippet(title=attrs['title'], code=attrs['code'], ...)

nadzieję, że pomoże!

+1

Cześć Tom, świetne ramy. Wyglądasz tak młodo, ale domyślam się, że wszyscy ninja są w tych dniach. Z perspektywy czasu ** attrs jest bardzo oczywiste, po prostu nie wiedziałem o tym w moich przygodach w Pythonie. Wszystko to jest bardzo dobrze udokumentowane, wyszukiwanie w Google było trochę trudne. Wiem, że dokumentacja nie musi uczyć ludzi Python i Django, to jest poza zakresem. Ale dodawanie komentarzy pomaga ludziom takim jak ja, jestem pewien. – user798719

+0

Hi Tom, Jak korzystać z attrs.get() dla zagnieżdżonych serializerów? – user1876508

+0

Cześć Tom, nie jest dla mnie jasne, kiedy instancja będzie równa Brakowi, a także niejasna jako jaka jest instancja, którą możesz rozwinąć? –

2

W wersji DRF 3.0+ usunięto metodę restore_object. Teraz można korzystać z dwóch oddzielnych metod: .create i .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) 

notatki wydaniu: http://www.django-rest-framework.org/topics/3.0-announcement/

Powiązane problemy