Параметры атрибута 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/