diff --git a/pydantic/main.py b/pydantic/main.py
--- a/pydantic/main.py
+++ b/pydantic/main.py
@@ -367,8 +367,10 @@ def __setattr__(self, name, value):
         elif self.__config__.validate_assignment:
             known_field = self.__fields__.get(name, None)
             if known_field:
-                value, error_ = known_field.validate(value, self.dict(exclude={name}), loc=name, cls=self.__class__)
+                original_value = self.__dict__.pop(name)
+                value, error_ = known_field.validate(value, self.__dict__, loc=name, cls=self.__class__)
                 if error_:
+                    self.__dict__[name] = original_value
                     raise ValidationError([error_], self.__class__)
         self.__dict__[name] = value
         self.__fields_set__.add(name)

diff --git a/tests/test_validators.py b/tests/test_validators.py
--- a/tests/test_validators.py
+++ b/tests/test_validators.py
@@ -185,6 +185,30 @@ def test_validating_assignment_dict():
     ]
 
 
+def test_validating_assignment_values_dict():
+    class ModelOne(BaseModel):
+        a: int
+
+    class ModelTwo(BaseModel):
+        m: ModelOne
+        b: int
+
+        @validator('b')
+        def validate_b(cls, b, values):
+            if 'm' in values:
+                return b + values['m'].a  # this fails if values['m'] is a dict
+            else:
+                return b
+
+        class Config:
+            validate_assignment = True
+
+    model = ModelTwo(m=ModelOne(a=1), b=2)
+    assert model.b == 3
+    model.b = 3
+    assert model.b == 4
+
+
 def test_validate_multiple():
     # also test TypeError
     class Model(BaseModel):

"values" parameter in validator receives ambiguous types
### Checks

* [x] I added a descriptive title to this issue
* [x] I have searched (google, github) for similar issues and couldn't find anything
* [x] I have read and followed [the docs](https://pydantic-docs.helpmanual.io/) and still think this is a bug

# Bug

Output of `python -c "import pydantic.utils; print(pydantic.utils.version_info())"`:
```
python -c "import pydantic.utils; print(pydantic.utils.version_info())"                                          
             pydantic version: 1.6.1
            pydantic compiled: True
                 install path: /homes/<redacted>/.conda/envs/<redacted>/lib/python3.7/site-packages/pydantic
               python version: 3.7.8 | packaged by conda-forge | (default, Jul 31 2020, 02:25:08)  [GCC 7.5.0]
                     platform: Linux-4.9.0-0.bpo.6-amd64-x86_64-with-debian-8.11
     optional deps. installed: ['typing-extensions']
```

Hi,
In a validator method, when adding the `values` parameter, I expect it to be a map from field names to validated types.
When specifying `validate_assignment = True` in model config, `values` gets a different type (just on assignment).
This is illustrated by the example below:

```py
import pydantic

class ModelOne(pydantic.BaseModel):
    a: int

class ModelTwo(pydantic.BaseModel):
    m: ModelOne
    b: int

    @pydantic.validator('b')
    def validate_b(cls, b, values):
        print(values)
        if 'm' in values:
            return b + values['m'].a  # this fails with AttributeError if values['m'] is a dict
        else:
            return b

    class Config:
        validate_assignment = True

model = ModelTwo(m=ModelOne(a=1), b=2)
#> {'m': ModelOne(a=1)}
model.b = 3
#> {'m': {'a': 1}}
```

As far as I can tell, this behavior is not documented, and I'm pretty sure it's not intended.

edit: created a PR
"values" parameter in validator receives ambiguous types
### Checks

* [x] I added a descriptive title to this issue
* [x] I have searched (google, github) for similar issues and couldn't find anything
* [x] I have read and followed [the docs](https://pydantic-docs.helpmanual.io/) and still think this is a bug

# Bug

Output of `python -c "import pydantic.utils; print(pydantic.utils.version_info())"`:
```
python -c "import pydantic.utils; print(pydantic.utils.version_info())"                                          
             pydantic version: 1.6.1
            pydantic compiled: True
                 install path: /homes/<redacted>/.conda/envs/<redacted>/lib/python3.7/site-packages/pydantic
               python version: 3.7.8 | packaged by conda-forge | (default, Jul 31 2020, 02:25:08)  [GCC 7.5.0]
                     platform: Linux-4.9.0-0.bpo.6-amd64-x86_64-with-debian-8.11
     optional deps. installed: ['typing-extensions']
```

Hi,
In a validator method, when adding the `values` parameter, I expect it to be a map from field names to validated types.
When specifying `validate_assignment = True` in model config, `values` gets a different type (just on assignment).
This is illustrated by the example below:

```py
import pydantic

class ModelOne(pydantic.BaseModel):
    a: int

class ModelTwo(pydantic.BaseModel):
    m: ModelOne
    b: int

    @pydantic.validator('b')
    def validate_b(cls, b, values):
        print(values)
        if 'm' in values:
            return b + values['m'].a  # this fails with AttributeError if values['m'] is a dict
        else:
            return b

    class Config:
        validate_assignment = True

model = ModelTwo(m=ModelOne(a=1), b=2)
#> {'m': ModelOne(a=1)}
model.b = 3
#> {'m': {'a': 1}}
```

As far as I can tell, this behavior is not documented, and I'm pretty sure it's not intended.

edit: created a PR

tests/test_validators.py::test_validating_assignment_values_dict
tests/test_validators.py::test_simple tests/test_validators.py::test_int_validation tests/test_validators.py::test_frozenset_validation tests/test_validators.py::test_validate_whole tests/test_validators.py::test_validate_kwargs tests/test_validators.py::test_validate_pre_error tests/test_validators.py::test_validating_assignment_ok tests/test_validators.py::test_validating_assignment_fail tests/test_validators.py::test_validating_assignment_value_change tests/test_validators.py::test_validating_assignment_extra tests/test_validators.py::test_validating_assignment_dict tests/test_validators.py::test_validate_multiple tests/test_validators.py::test_classmethod tests/test_validators.py::test_duplicates tests/test_validators.py::test_use_bare tests/test_validators.py::test_use_no_fields tests/test_validators.py::test_validate_always tests/test_validators.py::test_validate_always_on_inheritance tests/test_validators.py::test_validate_not_always tests/test_validators.py::test_wildcard_validators tests/test_validators.py::test_wildcard_validator_error tests/test_validators.py::test_invalid_field tests/test_validators.py::test_validate_child tests/test_validators.py::test_validate_child_extra tests/test_validators.py::test_validate_child_all tests/test_validators.py::test_validate_parent tests/test_validators.py::test_validate_parent_all tests/test_validators.py::test_inheritance_keep tests/test_validators.py::test_inheritance_replace tests/test_validators.py::test_inheritance_new tests/test_validators.py::test_validation_each_item tests/test_validators.py::test_key_validation tests/test_validators.py::test_validator_always_optional tests/test_validators.py::test_validator_always_pre tests/test_validators.py::test_validator_always_post tests/test_validators.py::test_validator_always_post_optional tests/test_validators.py::test_datetime_validator tests/test_validators.py::test_pre_called_once tests/test_validators.py::test_make_generic_validator[fields0-_v_] tests/test_validators.py::test_make_generic_validator[fields1-_v_] tests/test_validators.py::test_make_generic_validator[fields2-_v_,_field_] tests/test_validators.py::test_make_generic_validator[fields3-_v_,_config_] tests/test_validators.py::test_make_generic_validator[fields4-_v_,_values_] tests/test_validators.py::test_make_generic_validator[fields5-_v_,_field_,_config_] tests/test_validators.py::test_make_generic_validator[fields6-_v_,_field_,_values_] tests/test_validators.py::test_make_generic_validator[fields7-_v_,_config_,_values_] tests/test_validators.py::test_make_generic_validator[fields8-_v_,_field_,_values_,_config_] tests/test_validators.py::test_make_generic_validator[fields9-_cls_,_v_] tests/test_validators.py::test_make_generic_validator[fields10-_cls_,_v_] tests/test_validators.py::test_make_generic_validator[fields11-_cls_,_v_,_field_] tests/test_validators.py::test_make_generic_validator[fields12-_cls_,_v_,_config_] tests/test_validators.py::test_make_generic_validator[fields13-_cls_,_v_,_values_] tests/test_validators.py::test_make_generic_validator[fields14-_cls_,_v_,_field_,_config_] tests/test_validators.py::test_make_generic_validator[fields15-_cls_,_v_,_field_,_values_] tests/test_validators.py::test_make_generic_validator[fields16-_cls_,_v_,_config_,_values_] tests/test_validators.py::test_make_generic_validator[fields17-_cls_,_v_,_field_,_values_,_config_] tests/test_validators.py::test_make_generic_validator_kwargs tests/test_validators.py::test_make_generic_validator_invalid tests/test_validators.py::test_make_generic_validator_cls_kwargs tests/test_validators.py::test_make_generic_validator_cls_invalid tests/test_validators.py::test_make_generic_validator_self tests/test_validators.py::test_assert_raises_validation_error tests/test_validators.py::test_whole tests/test_validators.py::test_root_validator tests/test_validators.py::test_root_validator_pre tests/test_validators.py::test_root_validator_repeat tests/test_validators.py::test_root_validator_repeat2 tests/test_validators.py::test_root_validator_self tests/test_validators.py::test_root_validator_extra tests/test_validators.py::test_root_validator_types tests/test_validators.py::test_root_validator_inheritance tests/test_validators.py::test_reuse_global_validators tests/test_validators.py::test_allow_reuse[True-True-True-True] tests/test_validators.py::test_allow_reuse[True-True-True-False] tests/test_validators.py::test_allow_reuse[True-True-False-True] tests/test_validators.py::test_allow_reuse[True-True-False-False] tests/test_validators.py::test_allow_reuse[True-False-True-True] tests/test_validators.py::test_allow_reuse[True-False-True-False] tests/test_validators.py::test_allow_reuse[True-False-False-True] tests/test_validators.py::test_allow_reuse[True-False-False-False] tests/test_validators.py::test_allow_reuse[False-True-True-True] tests/test_validators.py::test_allow_reuse[False-True-True-False] tests/test_validators.py::test_allow_reuse[False-True-False-True] tests/test_validators.py::test_allow_reuse[False-True-False-False] tests/test_validators.py::test_allow_reuse[False-False-True-True] tests/test_validators.py::test_allow_reuse[False-False-True-False] tests/test_validators.py::test_allow_reuse[False-False-False-True] tests/test_validators.py::test_allow_reuse[False-False-False-False] tests/test_validators.py::test_root_validator_classmethod[True-True] tests/test_validators.py::test_root_validator_classmethod[True-False] tests/test_validators.py::test_root_validator_classmethod[False-True] tests/test_validators.py::test_root_validator_classmethod[False-False] tests/test_validators.py::test_root_validator_skip_on_failure tests/test_validators.py::test_assignment_validator_cls tests/test_validators.py::test_literal_validator tests/test_validators.py::test_nested_literal_validator