Django-更新数据库项(如果存在)或插入(如果不存在)



如果UPC不存在,我想更新数据库中的项目数量或添加到库存中。我不知道该怎么写逻辑。到目前为止,我拥有的是:

我的观点:

from django.contrib.auth.decorators import login_required
from .forms import AuditItemForm
from .models import AuditItem
import datetime
@login_required
def audit_inventory(request):
form = AuditItemForm(request.POST or None)
if form.is_valid():
form.save(commit=False)
form_upc = form.cleaned_data.get('upc')
qty = form.cleaned_data.get('qty')
for instance in AuditItem.objects.all():
if instance.upc == form_upc:
instance.qty += qty
instance.user = str(request.user)
instance.last_updated = datetime.datetime.now()
instance.save()
elif instance.upc != form_upc:
form.save(commit=True)
return redirect('/audit')
context = {
"form": form,
"title": "Audit Inventory",
}
return render(request, "audit.html", context)

我的逻辑出了什么问题?它正确地更新了一个项目,但不允许我添加一个不存在的新项目。

不确定它是否是您想要的,但可以尝试get_or_create((函数,如果它是创建的或从数据库中提取的,它将返回项和布尔值

form = AuditItemForm(request.POST or None)
if form.is_valid():
form.save(commit=False)
form_upc = form.cleaned_data.get('upc')
qty = form.cleaned_data.get('qty')
# get item or create new one if it doesn't exist
item, created = AuditItem.objects.get_or_create(upc=form_upc)
# if it already exist, update quantity
if not created:
item.qty += qty
item.user = str(request.user)
item.last_updated = datetime.datetime.now()

# whether item was created or updated save it to database
item.save()

您需要的是update_or_create(默认值=None,**kwargs(

说明:一种方便的方法,用于使用给定的kwargs更新对象,必要时创建一个新对象。默认值是用于更新对象的(字段、值(对的字典。默认值可以是可调用的。

返回(object,created(的元组,其中object是已创建或更新的对象,created是指定是否创建了新对象的布尔值。

update_or_create方法尝试根据给定的kwargs从数据库中获取对象。如果找到匹配项,它会更新默认字典中传递的字段。这种方法的例子是:

obj, created = Person.objects.update_or_create(
first_name='John', last_name='Lennon',
defaults={'first_name': 'Bob'},
)

有关详细信息:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#update-或创建

最新更新