diff --git a/src/protean/core/entity.py b/src/protean/core/entity.py
index a1a28aa0..2d5bfbed 100644
--- a/src/protean/core/entity.py
+++ b/src/protean/core/entity.py
@@ -61,11 +61,19 @@ class EntityBase(type):
         # Load list of Attributes from declared fields, depending on type of fields
         new_class._load_attributes()
 
-        # Construct an empty QuerySet associated with this Entity class
-        new_class.query = QuerySet(name)
-
         return new_class
 
+    @property
+    def query(cls):
+        """Construct an empty QuerySet associated with an Entity class
+            everytime a new `query` object is created
+
+        This is required so as not to corrupt the query object associated with the metaclass
+        when invoked like `Dog.query.all()` directly. A new query, and a corresponding `Pagination`
+        result would be created every time.
+        """
+        return QuerySet(cls.__name__)
+
     def _load_base_class_fields(new_class, bases, attrs):
         """If this class is subclassing another Entity, add that Entity's
         fields.  Note that we loop over the bases in *reverse*.
@@ -305,6 +313,48 @@ class QuerySet:
 
         return results
 
+    def update(self, *data, **kwargs):
+        """Updates all objects with details given if they match a set of conditions supplied.
+
+        Returns the number of objects matched (which may not be equal to the number of objects
+            updated if objects rows already have the new value).
+        """
+        updated_item_count = 0
+        try:
+            items = self.all()
+
+            for item in items:
+                item.update(*data, **kwargs)
+                updated_item_count += 1
+        except Exception as exc:
+            # FIXME Log Exception
+            raise
+
+        return updated_item_count
+
+    def delete(self):
+        """Deletes matching objects from the Repository
+
+        Does not throw error if no objects are matched.
+        Throws ObjectNotFoundError if the object was not found in the repository
+
+        Returns the number of objects matched (which may not be equal to the number of objects
+            deleted if objects rows already have the new value).
+        """
+        # Fetch Model class and connected-adapter from Repository Factory
+        deleted_item_count = 0
+        try:
+            items = self.all()
+
+            for item in items:
+                item.delete()
+                deleted_item_count += 1
+        except Exception as exc:
+            # FIXME Log Exception
+            raise
+
+        return deleted_item_count
+
     ###############################
     # Python Magic method support #
     ###############################

Add support for `update_by` and `delete_by`
diff --git a/tests/core/test_entity.py b/tests/core/test_entity.py
index 2c1bf20a..de314e2f 100644
--- a/tests/core/test_entity.py
+++ b/tests/core/test_entity.py
@@ -271,6 +271,28 @@ class TestEntity:
         with pytest.raises(ValidationError):
             dog.update(age='x')
 
+    def test_update_by(self):
+        """Test that update by query updates only correct records"""
+        Dog.create(id=1, name='Athos', owner='John', age=2)
+        Dog.create(id=2, name='Porthos', owner='John', age=3)
+        Dog.create(id=3, name='Aramis', owner='John', age=4)
+        Dog.create(id=4, name='dArtagnan', owner='John', age=5)
+
+        # Perform update
+        updated_count = Dog.query.filter(age__gt=3).update(owner='Jane')
+
+        # Query and check if only the relevant records have been updated
+        assert updated_count == 2
+
+        u_dog1 = Dog.get(1)
+        u_dog2 = Dog.get(2)
+        u_dog3 = Dog.get(3)
+        u_dog4 = Dog.get(4)
+        assert u_dog1.owner == 'John'
+        assert u_dog2.owner == 'John'
+        assert u_dog3.owner == 'Jane'
+        assert u_dog4.owner == 'Jane'
+
     def test_unique(self):
         """ Test the unique constraints for the entity """
         Dog.create(id=2, name='Johnny', owner='Carey')
@@ -490,6 +512,28 @@ class TestEntity:
         with pytest.raises(ObjectNotFoundError):
             Dog.get(3)
 
+    def test_delete_by(self):
+        """Test that update by query updates only correct records"""
+        Dog.create(id=1, name='Athos', owner='John', age=2)
+        Dog.create(id=2, name='Porthos', owner='John', age=3)
+        Dog.create(id=3, name='Aramis', owner='John', age=4)
+        Dog.create(id=4, name='dArtagnan', owner='John', age=5)
+
+        # Perform update
+        deleted_count = Dog.query.filter(age__gt=3).delete()
+
+        # Query and check if only the relevant records have been updated
+        assert deleted_count == 2
+        assert Dog.query.all().total == 2
+
+        assert Dog.get(1) is not None
+        assert Dog.get(2) is not None
+        with pytest.raises(ObjectNotFoundError):
+            Dog.get(3)
+
+        with pytest.raises(ObjectNotFoundError):
+            Dog.get(4)
+
     def test_filter_returns_q_object(self):
         """Test Negation of a criteria"""
         # Add multiple entries to the DB

pip install -e .
parse_log_pytest
requirements.txt
pytest
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.16
babel==2.17.0
certifi==2025.1.31
charset-normalizer==3.4.1
check-manifest==0.37
Click==7.0
coverage==4.5.1
distlib==0.3.9
docutils==0.14
exceptiongroup==1.2.2
filelock==3.18.0
flake8==3.5.0
idna==3.10
imagesize==1.4.1
iniconfig==2.1.0
Jinja2==3.1.6
MarkupSafe==3.0.2
mccabe==0.6.1
packaging==24.2
pkginfo==1.12.1.2
platformdirs==4.3.7
pluggy==0.13.1
-e git+https://github.com/proteanhq/protean.git@476114f8216bb9b50593bd27f94c3f6253eb9caa#egg=protean
py==1.11.0
pycodestyle==2.3.1
pyflakes==1.6.0
Pygments==2.19.1
pytest==7.4.4
pytest-flake8==1.0.4
python-dateutil==2.7.3
requests==2.32.3
requests-toolbelt==1.0.0
six==1.17.0
snowballstemmer==2.2.0
Sphinx==1.8.3
sphinxcontrib-serializinghtml==2.0.0
sphinxcontrib-websupport==1.2.4
tomli==2.2.1
tox==3.1.2
tqdm==4.67.1
twine==1.11.0
urllib3==2.3.0
virtualenv==20.29.3

name: protean
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.16
      - babel==2.17.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - check-manifest==0.37
      - click==7.0
      - coverage==4.5.1
      - distlib==0.3.9
      - docutils==0.14
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - flake8==3.5.0
      - idna==3.10
      - imagesize==1.4.1
      - iniconfig==2.1.0
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - mccabe==0.6.1
      - packaging==24.2
      - pkginfo==1.12.1.2
      - platformdirs==4.3.7
      - pluggy==0.13.1
      - py==1.11.0
      - pycodestyle==2.3.1
      - pyflakes==1.6.0
      - pygments==2.19.1
      - pytest==7.4.4
      - pytest-flake8==1.0.4
      - python-dateutil==2.7.3
      - requests==2.32.3
      - requests-toolbelt==1.0.0
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==1.8.3
      - sphinxcontrib-serializinghtml==2.0.0
      - sphinxcontrib-websupport==1.2.4
      - tomli==2.2.1
      - tox==3.1.2
      - tqdm==4.67.1
      - twine==1.11.0
      - urllib3==2.3.0
      - virtualenv==20.29.3
prefix: /opt/conda/envs/protean

tests/core/test_entity.py::TestEntity::test_update_by tests/core/test_entity.py::TestEntity::test_delete_by
tests/core/test_entity.py::TestEntity::test_init tests/core/test_entity.py::TestEntity::test_individuality tests/core/test_entity.py::TestEntity::test_required_fields tests/core/test_entity.py::TestEntity::test_defaults tests/core/test_entity.py::TestEntity::test_validate_string_length tests/core/test_entity.py::TestEntity::test_validate_data_value_against_type tests/core/test_entity.py::TestEntity::test_template_init tests/core/test_entity.py::TestEntity::test_error_messages tests/core/test_entity.py::TestEntity::test_entity_inheritance tests/core/test_entity.py::TestEntity::test_default_id tests/core/test_entity.py::TestEntity::test_to_dict tests/core/test_entity.py::TestEntity::test_get tests/core/test_entity.py::TestEntity::test_get_object_not_found_error tests/core/test_entity.py::TestEntity::test_find_by tests/core/test_entity.py::TestEntity::test_find_by_object_not_found_error tests/core/test_entity.py::TestEntity::test_find_by_multiple_attributes tests/core/test_entity.py::TestEntity::test_find_by_multiple_attributes_object_not_found_error tests/core/test_entity.py::TestEntity::test_create_error tests/core/test_entity.py::TestEntity::test_create tests/core/test_entity.py::TestEntity::test_save tests/core/test_entity.py::TestEntity::test_save_validation_error tests/core/test_entity.py::TestEntity::test_save_invalid_value tests/core/test_entity.py::TestEntity::test_update_with_invalid_id tests/core/test_entity.py::TestEntity::test_update_with_dict tests/core/test_entity.py::TestEntity::test_update_with_kwargs tests/core/test_entity.py::TestEntity::test_update_with_dict_and_kwargs tests/core/test_entity.py::TestEntity::test_that_update_runs_validations tests/core/test_entity.py::TestEntity::test_unique tests/core/test_entity.py::TestEntity::test_query_init tests/core/test_entity.py::TestEntity::test_filter_chain_initialization_from_entity tests/core/test_entity.py::TestEntity::test_filter_chaining tests/core/test_entity.py::TestEntity::test_filter_chain_results_1 tests/core/test_entity.py::TestEntity::test_filter_chain_results_2 tests/core/test_entity.py::TestEntity::test_filter_chain_results_3 tests/core/test_entity.py::TestEntity::test_filter_norm tests/core/test_entity.py::TestEntity::test_exclude tests/core/test_entity.py::TestEntity::test_exclude_multiple tests/core/test_entity.py::TestEntity::test_comparisons tests/core/test_entity.py::TestEntity::test_invalid_comparison_on_query_evaluation tests/core/test_entity.py::TestEntity::test_pagination tests/core/test_entity.py::TestEntity::test_delete tests/core/test_entity.py::TestEntity::test_filter_returns_q_object tests/core/test_entity.py::TestEntityMetaAttributes::test_meta_on_init tests/core/test_entity.py::TestEntityMetaAttributes::test_declared_fields_normal tests/core/test_entity.py::TestEntityMetaAttributes::test_declared_fields_with_reference tests/core/test_entity.py::TestEntityMetaAttributes::test_declared_fields_with_hasone_association
src/protean/core/entity.py
src/protean/core/entity.py