diff --git a/pydantic/main.py b/pydantic/main.py
--- a/pydantic/main.py
+++ b/pydantic/main.py
@@ -384,14 +384,14 @@ def __setattr__(self, name, value):  # noqa: C901 (ignore complexity)
 
             known_field = self.__fields__.get(name, None)
             if known_field:
-                original_value = self.__dict__.pop(name)
-                try:
-                    value, error_ = known_field.validate(value, self.__dict__, loc=name, cls=self.__class__)
-                    if error_:
-                        raise ValidationError([error_], self.__class__)
-                except Exception:
-                    self.__dict__[name] = original_value
-                    raise
+                # We want to
+                # - make sure validators are called without the current value for this field inside `values`
+                # - keep other values (e.g. submodels) untouched (using `BaseModel.dict()` will change them into dicts)
+                # - keep the order of the fields
+                dict_without_original_value = {k: v for k, v in self.__dict__.items() if k != name}
+                value, error_ = known_field.validate(value, dict_without_original_value, loc=name, cls=self.__class__)
+                if error_:
+                    raise ValidationError([error_], self.__class__)
                 else:
                     new_values[name] = value
 

diff --git a/tests/test_validators.py b/tests/test_validators.py
--- a/tests/test_validators.py
+++ b/tests/test_validators.py
@@ -5,7 +5,7 @@
 
 import pytest
 
-from pydantic import BaseModel, ConfigError, Extra, ValidationError, errors, validator
+from pydantic import BaseModel, ConfigError, Extra, Field, ValidationError, errors, validator
 from pydantic.class_validators import make_generic_validator, root_validator
 from pydantic.typing import Literal
 
@@ -1162,7 +1162,8 @@ def test_field_that_is_being_validated_is_excluded_from_validator_values(mocker)
 
     class Model(BaseModel):
         foo: str
-        bar: str
+        bar: str = Field(alias='pika')
+        baz: str
 
         class Config:
             validate_assignment = True
@@ -1170,12 +1171,27 @@ class Config:
         @validator('foo')
         def validate_foo(cls, v, values):
             check_values({**values})
+            return v
+
+        @validator('bar')
+        def validate_bar(cls, v, values):
+            check_values({**values})
+            return v
 
-    model = Model(foo='foo_value', bar='bar_value')
+    model = Model(foo='foo_value', pika='bar_value', baz='baz_value')
     check_values.reset_mock()
 
+    assert list(dict(model).items()) == [('foo', 'foo_value'), ('bar', 'bar_value'), ('baz', 'baz_value')]
+
     model.foo = 'new_foo_value'
-    check_values.assert_called_once_with({'bar': 'bar_value'})
+    check_values.assert_called_once_with({'bar': 'bar_value', 'baz': 'baz_value'})
+    check_values.reset_mock()
+
+    model.bar = 'new_bar_value'
+    check_values.assert_called_once_with({'foo': 'new_foo_value', 'baz': 'baz_value'})
+
+    # ensure field order is the same
+    assert list(dict(model).items()) == [('foo', 'new_foo_value'), ('bar', 'new_bar_value'), ('baz', 'baz_value')]
 
 
 def test_exceptions_in_field_validators_restore_original_field_value():

`validate_assignment` changes the field order
### Checks

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

<!-- Sorry to sound so draconian, but every second saved replying to issues is time spend improving pydantic :-) -->

# Bug

```
             pydantic version: 1.7.1
            pydantic compiled: True
                 install path: /home/user/work/bugs/python/pydantic-ordering/.venv/lib/python3.8/site-packages/pydantic
               python version: 3.8.5 (default, Jul 28 2020, 12:59:40)  [GCC 9.3.0]
                     platform: Linux-4.19.128-microsoft-standard-x86_64-with-glibc2.29
     optional deps. installed: []
```
<!-- or if you're using pydantic prior to v1.3, manually include: OS, python version and pydantic version -->

<!-- Please read the [docs](https://pydantic-docs.helpmanual.io/) and search through issues to
confirm your bug hasn't already been reported. -->

<!-- Where possible please include a self-contained code snippet describing your bug: -->

Including `validate_assignment = True` in a model's config seems to cause assignment to change the field order when using `dict()`. This change was discovered when upgrading to 1.7.0 and also applies to 1.7.1, but was not present in prior versions.

This behaviour does not seem to agree with <https://pydantic-docs.helpmanual.io/usage/models/#field-ordering>, and is something that is important for my uses (where it generates massive diffs in the output) and surely others.

Running this snippet with and without the `validate_assignment` line produces different output:
```py
from pydantic import BaseModel

class Model(BaseModel):
    title: str = ''
    name: str = ''

    class Config:
        validate_assignment = True
        ...

m = Model(name='name')
m.title = 'title'
print(m.dict())
```



tests/test_validators.py::test_field_that_is_being_validated_is_excluded_from_validator_values
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_deque_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_validating_assignment_values_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 tests/test_validators.py::test_exceptions_in_field_validators_restore_original_field_value