def test_has_no_changes(self):
        justin = Person(first_name='Justin', last_name='Trudeau')
        justin.save()

        serializer = PersonSerializer(justin, data={
            'first_name': 'Justin',
            'last_name': 'Trudeau',
            'partner': ''
        })

        serializer.is_valid()
        self.assertFalse(serializers.has_changes(serializer))
    def process_row(self, row, data, context):
        if data.processed:
            return

        serializer = self.serializer(instance=data.instance,
                                     data=row.data.copy(),
                                     context=context,
                                     partial=data.instance is not None)

        if not serializers.might_have_changes(serializer):
            row.status = RowStatus.unchanged
            data.processed = True
            return

        is_valid = serializer.is_valid()
        has_changes = serializers.has_changes(serializer)

        cannot_update = (
            data.instance
            and (has_changes or not is_valid)
            and not self.can_update_object(data.instance)
        )

        if cannot_update:
            row.set_error(self.error_messages['cannot_update'])
            data.processed = True
            return

        if not is_valid:
            row.set_errors(serializer.errors)
            data.processed = True
            return

        if not has_changes:
            row.status = RowStatus.unchanged
            data.processed = True
            return

        if serializer.instance:
            row.status = RowStatus.update
            row.diff = serializers.get_diff_data(serializer)
            serializer.save()
            data.processed = True

        else:
            row.status = RowStatus.new
            row.diff = serializers.get_diff_data(serializer)
            data.instance = serializer.save()
            data.processed = True
            self.cache_instance(context, data.instance)