【问题标题】:How to update model in Django using kwargs如何使用 kwargs 在 Django 中更新模型
【发布时间】:2021-07-03 09:27:18
【问题描述】:

我正在为我的模型编写更新方法:

class Task(models.Model):
    @staticmethod
    def update_task(task_id: int, calendar_path: str, **kwargs):
        cal = get_object_or_404(Calendar, path=calendar_path)
        task = get_object_or_404(Task, id=task_id)
        if task.calendar != cal:
            raise FieldError("Calendar does not contains this task")
        for field_name, value in kwargs:
            task

我希望重命名 kwargs 中的所有字段,例如: update_task(..., name = "New Name", description = "New description") 但是我不知道怎么做,不使用 eval,但这不是一个好主意。

【问题讨论】:

  • 我不太清楚你打算做什么。
  • 我想创建一个函数,它将接受关键字参数作为输入并更新数据库中的任务,例如:` update_task(task_id = 10, calendar_path = "foo", name="New name ) ` 此代码应更改 id = 10 的任务:task.name = "New name"

标签: python django model keyword-argument


【解决方案1】:

我们枚举完所有键值对后,您可以使用setattr(…) [python-doc] 并保存Task 对象:

@staticmethod
def update_task(task_id: int, calendar_path: str, **kwargs):
    task = get_object_or_404(Task, id=task_id, calendar__path=calendar_path)
    for field_name, value in kwargs.items():
        setattr(task, field_name, value)
    task.save()

setattr(<i>x</i>, '<i>y</i>', <i>value</i>) 等价于 <i>x</i>.<i>y</i> = <i>value</i>。我们也可以省略获取日历,方法是在过滤器部分添加 get_object_or_404(…)

【讨论】:

    【解决方案2】:

    您可以使用解包 * 来做到这一点 例如:

    do_it(**{"la":"ga", "gaga":"laga"}) 
    

    相同
    do_it(la = "ga", gaga= "laga") 
    

    所以回答

    Task.objects.update(**kwargs)
    

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2012-03-05
      • 2019-07-01
      • 2019-09-30
      • 2014-05-05
      • 2016-12-18
      • 2015-01-28
      相关资源
      最近更新 更多