当我尝试在 models.py 中重命名字段名时出错

Error when I try to rename fieldname in my models.py

烦人的问题。我想将模型中的字段从 reconciled_type 重命名为 import_type。一旦更改字段名,我就会收到以下错误消息,无法继续进行 MakeMigrations。

raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'reconciled_type' into field. Choices are: account, amount, category, category_id, created, currency, data, description, id, import_journal_entry, import_journal_entry_id, import_type, is_load, merchant, merchant_id, monzo_id, settled, transaction_datetime, updated

Models.py中的字段:

    IMPORT_TYPE_CHOICES = (
        ('r', 'Reconciled'),
        ('i', 'Ignore'),
    )
    reconciled_type = models.CharField(
        max_length=1,
        choices=IMPORT_TYPE_CHOICES,
        blank=True, null=True,
        )

完整的追溯是:

Performing system checks...

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\Philip\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\Philip\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\utils\autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\management\commands\runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\management\base.py", line 392, in check
    all_issues = self._run_checks(
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\management\base.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\urls\resolvers.py", 
line 406, in check
    for pattern in self.url_patterns:
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\urls\resolvers.py", 
line 587, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\urls\resolvers.py", 
line 580, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:\Users\Philip\AppData\Local\Programs\Python\Python38-32\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\Philip\CodeRepos\Acacia2\acacia2\urls.py", line 6, in <module>
    import monzo.views
  File "C:\Users\Philip\CodeRepos\Acacia2\monzo\views.py", line 11, in <module>
    from .forms import ReconciliationForm
  File "C:\Users\Philip\CodeRepos\Acacia2\monzo\forms.py", line 8, in <module>
    class ReconciliationForm(forms.Form):
  File "C:\Users\Philip\CodeRepos\Acacia2\monzo\forms.py", line 9, in ReconciliationForm    
    transaction = forms.ModelChoiceField(queryset=Transaction.objects.filter(reconciled_type__isnull=True),required=True)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\query.py", line 904, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\query.py", line 923, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\sql\query.py", line 1337, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\sql\query.py", line 1362, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\sql\query.py", line 1239, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\sql\query.py", line 1077, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())        
  File "C:\Users\Philip\CodeRepos\Acacia2\venv\lib\site-packages\django\db\models\sql\query.py", line 1466, in names_to_path
    raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'reconciled_type' into field. Choices are: account, amount, category, category_id, created, currency, data, description, id, import_journal_entry, import_journal_entry_id, import_type, is_load, merchant, merchant_id, monzo_id, settled, transaction_datetime, updated

在你的 ReconciliationForm 中你写了这样一行:

class ReconciliationForm(forms.ModelForm):
    transaction = forms.ModelChoiceField(
       queryset=Transaction.objects.filter(<b>reconciled_type__isnull=True</b>),
       required=True
    )
    # …

但是由于您重命名了该字段,因此查询集的构造将引发错误,您还需要更改查询:

class ReconciliationForm(forms.ModelForm):
    transaction = forms.ModelChoiceField(
        queryset=Transaction.objects.filter(<b>import_type=None</b>),
        required=True
    )
    # …

您可能需要更改更多依赖于该字段的查询集。

这个错误的原因可能是因为django无法解析你的选择, 选择,应该是一个列表

    IMPORT_TYPE_CHOICES = [ # converted to list from tuple
        ('r', 'Reconciled'),
        ('i', 'Ignore'),
    ]