1

我正在尝试将 Django 项目从版本 3.2.10 更新到 4.0.1

运行测试时,我收到此错误:

File "/Users/akira/Projects/work/speedy/cash_flow/jobs/bank_account/process_flinks_transactions_job.py", line 63, in __init__
    super(ProcessFlinksTransactionsJob, self).__init__(*args, **kwargs)
  File "/Users/akira/.local/share/virtualenvs/speedy-kJQJ8v9W/lib/python3.8/site-packages/django/db/models/base.py", line 446, in __init__
    raise TypeError(
TypeError: ProcessFlinksTransactionsJob() got both positional and keyword arguments for field 'name'.

引发错误的代码是:

class ProcessFlinksTransactionsJob(Job):
objects = ProcessFlinksTransactionsJobManager()

def __init__(self, *args, **kwargs):
    kwargs.update({"name": ProcessFlinksTransactionsJob.__name__})

    super(ProcessFlinksTransactionsJob, self).__init__(*args, **kwargs)

我将如何解决这个错误?

4

2 回答 2

0

我今天偶然发现了这一点,虽然 Mariusz 的解决方案是有道理的,但有时您可能会使用该对象而不保存它。

这是触发的,因为当从 db 加载模型时,它由new = cls(*values)实例化。如果您的init设置了一个带有关键字的字段,则#22640中引入的更改将在从 db 创建对象时引发错误(因为它可能在您的测试中)。

对我有用的解决方法是仅在没有参数的情况下才在init上设置字段。

在您的情况下,它将是:

class ProcessFlinksTransactionsJob(Job):
    objects = ProcessFlinksTransactionsJobManager()

    def __init__(self, *args, **kwargs):
        if not args:
             kwargs.update({"name": ProcessFlinksTransactionsJob.__name__})
        super(ProcessFlinksTransactionsJob, self).__init__(*args, **kwargs)

这样,对象在从 db 加载时被正确实例化,并且可以通过编程方式创建并保持当前行为。

希望这对你有用!:)

于 2022-01-12T07:28:07.127 回答
0

在 DjangoProject 上找到了一个相关线程,请参见此处

正如评论所说:

这是预期的更改,请参阅73b1b225ce1a3318d4478f90cc0db0a260aba3aa。添加此错误是为了防止在传入相同字段的值时args以及kwargs在您的情况下出现错误配置。我建议将此逻辑移至save().

除了同意 Mariusz Felisiak 之外,我别无他法 :)

于 2022-01-10T01:20:38.827 回答