diff --git a/beets/dbcore/db.py b/beets/dbcore/db.py
index 0f4dc1513..e92cba40c 100755
--- a/beets/dbcore/db.py
+++ b/beets/dbcore/db.py
@@ -290,10 +290,10 @@ class Model(object):
         if key in self._values_flex:  # Flexible.
             del self._values_flex[key]
             self._dirty.add(key)  # Mark for dropping on store.
+        elif key in self._fields:  # Fixed
+            setattr(self, key, self._type(key).null)
         elif key in self._getters():  # Computed.
             raise KeyError(u'computed field {0} cannot be deleted'.format(key))
-        elif key in self._fields:  # Fixed.
-            raise KeyError(u'fixed field {0} cannot be deleted'.format(key))
         else:
             raise KeyError(u'no such field {0}'.format(key))
 
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 2d456ae88..2b8ede053 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -42,6 +42,10 @@ New features:
 * The ``albumdisambig`` field no longer includes the MusicBrainz release group
   disambiguation comment. A new ``releasegroupdisambig`` field has been added.
   :bug:`3024`
+* The :ref:`modify-cmd` command now allows resetting fixed attributes. For
+  example, ``beet modify -a artist:beatles artpath!`` resets ``artpath``
+  attribute from matching albums back to the default value.
+  :bug:`2497`
 
 Changes:
 

modify: Field deletion (foo!) should work for fixed attributes by setting them to null
### Problem

`foo!` works if foo is a flexible field, but it doesn't do anything if it's a fixed attribute.

Example from IRC Chat:

User not able to delete/reset artpath: to "None" as modify only results in artpath being the current working directory: 

```sh
# beet modify -a 2cellos artpath!
Modifying 1 albums.
No changes to make.
# beet modify -a 2cellos artpath=''
Modifying 1 albums. 
2CELLOS - 2Cellos
  artpath: /media/music/processed/2CELLOS/2011 - 2Cellos/cover.jpg -> /root  
Really modify, move and write tags? (Yes/no/select) n 
```

Led to this problem:

```
artpath: /media/music/processed/2CELLOS/2011 - 2Cellos/cover.jpg -> /root  
```
should be:
```
artpath: /media/music/processed/2CELLOS/2011 - 2Cellos/cover.jpg -> None
```
### Setup

* OS: Linux bedmoode 4.4.30-v7+ #919 SMP Tue Nov 1 16:57:28 GMT 2016 armv7l GNU/Linux 
* Python version: Python 3.4.2
* beets version: beets version 1.4.4
* Turning off plugins made problem go away (yes/no): no


diff --git a/test/test_dbcore.py b/test/test_dbcore.py
index d2d97d4b3..4c646802d 100644
--- a/test/test_dbcore.py
+++ b/test/test_dbcore.py
@@ -114,6 +114,19 @@ class AnotherTestModel(TestModel1):
     }
 
 
+class TestModel5(TestModel1):
+    _fields = {
+        'some_string_field': dbcore.types.STRING,
+        'some_float_field': dbcore.types.FLOAT,
+        'some_boolean_field': dbcore.types.BOOLEAN,
+    }
+
+
+class TestDatabase5(dbcore.Database):
+    _models = (TestModel5,)
+    pass
+
+
 class TestDatabaseTwoModels(dbcore.Database):
     _models = (TestModel2, AnotherTestModel)
     pass
@@ -266,9 +279,18 @@ class ModelTest(unittest.TestCase):
             del model['foo']
 
     def test_delete_fixed_attribute(self):
-        model = TestModel1()
-        with self.assertRaises(KeyError):
-            del model['field_one']
+        model = TestModel5()
+        model.some_string_field = 'foo'
+        model.some_float_field = 1.23
+        model.some_boolean_field = True
+
+        for field, type_ in model._fields.items():
+            print("%s - %s" % (model[field], field))
+            self.assertNotEqual(model[field], type_.null)
+
+        for field, type_ in model._fields.items():
+            del model[field]
+            self.assertEqual(model[field], type_.null)
 
     def test_null_value_normalization_by_type(self):
         model = TestModel1()

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest responses mock
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/beetbox/beets.git@3b78d933cf46d5cad8f90ea6cdf38ada9e10846f#egg=beets
certifi==2025.1.31
charset-normalizer==3.4.1
exceptiongroup==1.2.2
idna==3.10
iniconfig==2.1.0
jellyfish==1.2.0
mock==5.2.0
munkres==1.1.4
musicbrainzngs==0.7.1
mutagen==1.47.0
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
PyYAML==6.0.2
requests==2.32.3
responses==0.25.7
six==1.17.0
tomli==2.2.1
Unidecode==1.3.8
urllib3==2.3.0

name: beets
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:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - exceptiongroup==1.2.2
      - idna==3.10
      - iniconfig==2.1.0
      - jellyfish==1.2.0
      - mock==5.2.0
      - munkres==1.1.4
      - musicbrainzngs==0.7.1
      - mutagen==1.47.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pyyaml==6.0.2
      - requests==2.32.3
      - responses==0.25.7
      - six==1.17.0
      - tomli==2.2.1
      - unidecode==1.3.8
      - urllib3==2.3.0
prefix: /opt/conda/envs/beets

test/test_dbcore.py::ModelTest::test_delete_fixed_attribute
test/test_dbcore.py::MigrationTest::test_extra_model_adds_table test/test_dbcore.py::MigrationTest::test_open_with_fewer_fields_leaves_untouched test/test_dbcore.py::MigrationTest::test_open_with_multiple_new_fields test/test_dbcore.py::MigrationTest::test_open_with_new_field_adds_column test/test_dbcore.py::MigrationTest::test_open_with_same_fields_leaves_untouched test/test_dbcore.py::ModelTest::test_add_model test/test_dbcore.py::ModelTest::test_check_db_fails test/test_dbcore.py::ModelTest::test_computed_field test/test_dbcore.py::ModelTest::test_delete_flexattr test/test_dbcore.py::ModelTest::test_delete_flexattr_persists test/test_dbcore.py::ModelTest::test_delete_flexattr_via_dot test/test_dbcore.py::ModelTest::test_delete_internal_field test/test_dbcore.py::ModelTest::test_delete_non_existent_attribute test/test_dbcore.py::ModelTest::test_items test/test_dbcore.py::ModelTest::test_load_deleted_flex_field test/test_dbcore.py::ModelTest::test_missing_field test/test_dbcore.py::ModelTest::test_normalization_for_typed_flex_fields test/test_dbcore.py::ModelTest::test_null_value_normalization_by_type test/test_dbcore.py::ModelTest::test_null_value_stays_none_for_untyped_field test/test_dbcore.py::ModelTest::test_parse_nonstring test/test_dbcore.py::ModelTest::test_retrieve_by_id test/test_dbcore.py::ModelTest::test_store_and_retrieve_flexattr test/test_dbcore.py::ModelTest::test_store_fixed_field test/test_dbcore.py::FormatTest::test_format_fixed_field test/test_dbcore.py::FormatTest::test_format_flex_field test/test_dbcore.py::FormatTest::test_format_flex_field_bytes test/test_dbcore.py::FormatTest::test_format_typed_flex_field test/test_dbcore.py::FormatTest::test_format_unset_field test/test_dbcore.py::FormattedMappingTest::test_get_method_with_default test/test_dbcore.py::FormattedMappingTest::test_get_method_with_specified_default test/test_dbcore.py::FormattedMappingTest::test_get_unset_field test/test_dbcore.py::FormattedMappingTest::test_keys_equal_model_keys test/test_dbcore.py::ParseTest::test_parse_fixed_field test/test_dbcore.py::ParseTest::test_parse_flex_field test/test_dbcore.py::ParseTest::test_parse_untyped_field test/test_dbcore.py::QueryParseTest::test_colon_at_end test/test_dbcore.py::QueryParseTest::test_empty_query_part test/test_dbcore.py::QueryParseTest::test_escaped_colon test/test_dbcore.py::QueryParseTest::test_escaped_colon_in_regexp test/test_dbcore.py::QueryParseTest::test_keyed_regexp test/test_dbcore.py::QueryParseTest::test_multiple_years test/test_dbcore.py::QueryParseTest::test_one_basic_regexp test/test_dbcore.py::QueryParseTest::test_one_basic_term test/test_dbcore.py::QueryParseTest::test_one_keyed_term test/test_dbcore.py::QueryParseTest::test_single_year test/test_dbcore.py::QueryFromStringsTest::test_empty_query_part test/test_dbcore.py::QueryFromStringsTest::test_parse_fixed_type_query test/test_dbcore.py::QueryFromStringsTest::test_parse_flex_type_query test/test_dbcore.py::QueryFromStringsTest::test_two_parts test/test_dbcore.py::QueryFromStringsTest::test_zero_parts test/test_dbcore.py::SortFromStringsTest::test_fixed_field_sort test/test_dbcore.py::SortFromStringsTest::test_flex_field_sort test/test_dbcore.py::SortFromStringsTest::test_one_parts test/test_dbcore.py::SortFromStringsTest::test_special_sort test/test_dbcore.py::SortFromStringsTest::test_two_parts test/test_dbcore.py::SortFromStringsTest::test_zero_parts test/test_dbcore.py::ParseSortedQueryTest::test_and_query test/test_dbcore.py::ParseSortedQueryTest::test_leading_comma_or_query test/test_dbcore.py::ParseSortedQueryTest::test_no_space_before_comma_or_query test/test_dbcore.py::ParseSortedQueryTest::test_no_spaces_or_query test/test_dbcore.py::ParseSortedQueryTest::test_only_direction test/test_dbcore.py::ParseSortedQueryTest::test_or_query test/test_dbcore.py::ParseSortedQueryTest::test_trailing_comma_or_query test/test_dbcore.py::ResultsIteratorTest::test_concurrent_iterators test/test_dbcore.py::ResultsIteratorTest::test_iterate_once test/test_dbcore.py::ResultsIteratorTest::test_iterate_slow_sort test/test_dbcore.py::ResultsIteratorTest::test_iterate_twice test/test_dbcore.py::ResultsIteratorTest::test_length test/test_dbcore.py::ResultsIteratorTest::test_no_results test/test_dbcore.py::ResultsIteratorTest::test_out_of_range test/test_dbcore.py::ResultsIteratorTest::test_slow_query test/test_dbcore.py::ResultsIteratorTest::test_slow_query_negative test/test_dbcore.py::ResultsIteratorTest::test_slow_sort_subscript test/test_dbcore.py::ResultsIteratorTest::test_unsorted_subscript
docs/changelog.rst beets/dbcore/db.py
docs/changelog.rst beets/dbcore/db.py