我试图在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
)
答案 0 :(得分:2)
使用Django的update_or_create
进行此操作。
obj, created = UserUsageInfo.objects.update_or_create(...)
答案 1 :(得分:1)
您可以使用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可以模仿它(当然它会花费多个查询)。
答案 2 :(得分:0)
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然后更新。
答案 3 :(得分:0)
您可以通过两种方式实现目标:
最简单的方法是你可以使用update_or_create()方法为jjango提供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)