Параметры атрибута Django-REST для восстановления_объекта

Нахождение документарной документации Django-REST должно быть, несмотря на то, насколько оно длительное, все еще слишком светло для фона для меня.

Что делает функция attrs метода restore_object?

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)

Ответ 1

Я немного обновил документацию, чтобы сделать это более понятным...

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. См. здесь для хорошего объяснения.

В итоге это будет эквивалентно Snippet(title=attrs['title'], code=attrs['code'], ...)

Надеюсь, что это поможет!

Ответ 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/