From 5edf19e91982abc4c5298ef4da9f7e0e171025f6 Mon Sep 17 00:00:00 2001 From: Anton Martyniuk Date: Sun, 29 Jun 2014 16:30:58 +0200 Subject: [PATCH] updates test model definition due to RelationField changes --- rest_framework/relations.py | 2 +- rest_framework/serializers.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 8f35b1741..df17a8606 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -182,7 +182,7 @@ class RelatedField(WritableField): if value in self.null_values: if self.required: raise ValidationError(self.error_messages['required']) - into[(self.source or field_name)] = None + into[(self.source or field_name)] = [] if self.many else None elif self.many: into[(self.source or field_name)] = [self.from_native(item) for item in value] else: diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index c2b414d7a..25c45d923 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -18,6 +18,7 @@ import types from decimal import Decimal from django.contrib.contenttypes.generic import GenericForeignKey from django.core.paginator import Page +from django.core.exceptions import ObjectDoesNotExist from django.db import models from django.forms import widgets from django.utils.datastructures import SortedDict @@ -912,9 +913,19 @@ class ModelSerializer(Serializer): for field_name, field in self.fields.items(): field_name = field.source or field_name + + # PY3 compat problem with ManyToManyField & OneToOneField + # hasattr in PY2 catches all exceptions, but in PY3 it only looks + # for AttributeError + # @see: https://code.djangoproject.com/ticket/22839 + try: + field_exists = hasattr(instance, field_name) + except (AttributeError, ValueError, ObjectDoesNotExist): + field_exists = False + if field_name in exclusions \ and not field.read_only \ - and (field.required or hasattr(instance, field_name)) \ + and (field.required or field_exists) \ and not isinstance(field, Serializer): exclusions.remove(field_name) return exclusions