我正在尝试在Django中创建一个逻辑,检查用户是否已经提供了某些信息。如果没有,则创建新对象并保存在数据库中。信息已经存在,然后它用新信息更新相同的对象。我犯了一些错误,因为它能够创建一个新对象但不能更新它。
try: # Check if user already have data available
data_created_or_not = UserUsageInfo.objects.get(user_id=request.user.id).data_available_or_not
except Exception: # If not available than, make it false
data_created_or_not = False
if not data_created_or_not: # If its False then create new object
UserUsageInfo.objects.create(user=request.user,
space_used=used_space,
space_allocated=allocated_space,
folders_list=folders,
files_list=files,
files_hash_list=files_hash,
data_available_or_not=True
)
else: # If already there then update it
UserUsageInfo.objects.update(user=request.user,
space_used=used_space,
space_allocated=allocated_space,
folders_list=folders,
files_list=files,
files_hash_list=files_hash,
data_available_or_not=True
)
您可以使用QuerySet.update_or_create
:
UserUsageInfo.objects.update_or_create(user_id=request.user.id,
data_available_or_not=True,
defaults={
'user': request.user,
'space_used': used_space,
'space_allocated': allocated_space,
'folders_list': folders,
'files_list': files,
'files_hash_list': files_hash,
})
所以在这里我们使用user_id=request.user.id
作为过滤器以及data_available_or_not=True
。如果存在,我们使用defaults
更新,否则我们使用user_id=request.user.id
,data_available_or_not=True
和所有默认值创建一个新对象。
鉴于您使用的数据库引擎支持此操作,这可能导致单个查询。如果没有,Django可以模仿它(当然,它将花费多个查询)。
使用Django的update_or_create
。
obj, created = UserUsageInfo.objects.update_or_create(...)
try: # Check if user already have data available
data_created_or_not = UserUsageInfo.objects.get(user_id=request.user.id).data_available_or_not
except UserUsageInfo.DoesNotExist: # If not available than, make it false
data_created_or_not = False
if not data_created_or_not: # If its False then create new object
UserUsageInfo.objects.create(user=request.user,
space_used=used_space,
space_allocated=allocated_space,
folders_list=folders,
files_list=files,
files_hash_list=files_hash,
data_available_or_not=True
)
else: # If already there then update it
UserUsageInfo.objects.get(user=request.user).update(
space_used=used_space,
space_allocated=allocated_space,
folders_list=folders,
files_list=files,
files_hash_list=files_hash,
data_available_or_not=True
)
问题在于其他部分,您需要使用1st get然后更新。
你可以通过两种方式实现你的目标:最简单的方法是你可以使用update_or_create()方法django为queryset提供update()
方法,这意味着你需要使用过滤器然后更新数据,而不是使用get(),如下所示:
user_info = UserUsageInfo.objects.filter(user_id=request.user.id)
if user_info:
user_info.update(**update_values) # considering update_values as your dictionary containing all the information you want to add or update
else:
UserUsageInfo.objects.create(**update_values)