【问题标题】:Keywords Must Be Strings When Passing Variable As Parameter将变量作为参数传递时关键字必须是字符串
【发布时间】:2022-08-07 05:43:55
【问题描述】:

我正在尝试将变量作为关键字参数传递,如下所示:

@receiver(post_save, sender=BudgetTransaction)
def create_forecasted(sender, instance, created, **kwargs):
    if instance.transaction_type == \"EC\":
        return True

    if created:
        today = instance.next_date
        last_day = date(today.year, 12, 31)
        this_month = today.month
        weeks_left = int((last_day - today).days / 7)
        fortnights_left = int(weeks_left / 2)
        months_left = 12 - this_month

        if instance.frequency == \'weeks\':
            create_range = weeks_left
        elif instance.frequency == \'fort\':
            create_range = fortnights_left
        else:
            create_range = months_left

        loop = 1
        for i in range(create_range):
            if instance.frequency == \'fort\':
                true_frequency = \'weeks\'
                true_loop = loop * 2
            elif instance.frequency == \'4week\':
                true_frequency = \'weeks\'
                true_loop = loop * 4
            else:
                true_frequency = instance.frequency
                true_loop = loop


            ### PASSING VARIABLE HERE ###
            next_month = today + relativedelta(**{true_frequency: true_loop})
            date_string = next_month.strftime(\"%Y-%m-%d\")

            BudgetTransaction.objects.bulk_create([BudgetTransaction(
                owner=instance.owner,
                transaction_amount=instance.transaction_amount,
                transaction_name=instance.transaction_name,
                transaction_type=instance.transaction_type,
                next_date=date_string,
                frequency=instance.frequency,
            )])

            loop += 1

这是一个 django 站点,当我通过该站点运行它时它不会出错。但是,当我运行测试时,我得到了这个错误:

Error
Traceback (most recent call last):
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\bf_app\\tests\\test_models.py\", line 26, in test_transaction_has_owner
    transaction = TransactionFactory(owner=user)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\factory\\base.py\", line 40, in __call__
    return cls.create(**kwargs)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\factory\\base.py\", line 528, in create
    return cls._generate(enums.CREATE_STRATEGY, kwargs)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\factory\\django.py\", line 117, in _generate
    return super()._generate(strategy, params)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\factory\\base.py\", line 465, in _generate
    return step.build()
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\factory\\builder.py\", line 262, in build
    instance = self.factory_meta.instantiate(
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\factory\\base.py\", line 317, in instantiate
    return self.factory._create(model, *args, **kwargs)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\factory\\django.py\", line 166, in _create
    return manager.create(*args, **kwargs)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\django\\db\\models\\manager.py\", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\django\\db\\models\\query.py\", line 514, in create
    obj.save(force_insert=True, using=self.db)
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\django\\db\\models\\base.py\", line 806, in save
    self.save_base(
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\django\\db\\models\\base.py\", line 872, in save_base
    post_save.send(
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\django\\dispatch\\dispatcher.py\", line 176, in send
    return [
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\venv\\lib\\site-packages\\django\\dispatch\\dispatcher.py\", line 177, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File \"C:\\Users\\Mitchell\\PycharmProjects\\BudgieFinance_TW\\bf_app\\models.py\", line 82, in create_forecasted
    next_month = next_date + relativedelta(**{true_frequency: true_loop})
TypeError: keywords must be strings

我不完全确定如何解决这个问题,因为我以前从未将关键字作为变量传递,所以我不太熟悉这个过程。这发生在接收器对象上。

谢谢

  • 您可以从测试文件中扩展您的示例吗?问题不在您发布的代码中
  • 添加了额外的代码

标签: python python-3.x django receiver


【解决方案1】:

这里的问题是有时我将None 作为返回错误的变量传递。在测试中,我添加了一个正确的字符串参数,一切都很好!

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多