gpt4 book ai didi

django - 有没有一种惯用的方式来get_or_create然后在Django中更新对象?

转载 作者:行者123 更新时间:2023-12-04 11:40:06 25 4
gpt4 key购买 nike

我有一个名为StaffSettings的Django模型,其中包含针对Django应用中用户的各种配置选项。每个用户在StaffSettings表中最多具有一个条目。

假设一个设置是default_year_level,并且我有针对我的用户对象的代码,例如:

def set_default_year_level(u, year_level):
obj, _created = StaffSettings.objects.get_or_create(user=u)
obj.default_year_level = year_level
obj.save()

我希望函数的主体适合一行,因为这似乎是一种常见的用例,但是如果我将其定义为
def set_default_year_level(u, year_level):
StaffSettings.objects.filter(user=u).update(default_year_level=year_level)

如果有问题的用户在StaffSettings表中已经有一行,则该方法很好用,但如果该行不存在,则不会创建相关行。

惯用的/最佳的编码方式是什么? (例如,是否存在某种 filter_or_create函数?还是其他人编写了装饰器/帮助器函数来处理这一惯用法?)

最佳答案

我看不到您的第一个函数有任何问题,对于这个用例,我会写同样的东西。

但是,如果您需要在模型的许多字段上使用相同的功能,并且不想重复自己的操作,则可以将字段作为参数传递:

def set_default_value(u, field, value):
obj, _created = StaffSettings.objects.get_or_create(user=u)
setattr(obj, field, value)
obj.save()

而且我仍然会远离update()函数,因为该函数旨在一次更新多个对象,并且不会触发save()方法或模型上的信号(请参见 https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once)

关于django - 有没有一种惯用的方式来get_or_create然后在Django中更新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15473074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com