Django如何更新已保存在数据库中的多个字段的对象

问题描述 投票:1回答:4

我正在尝试在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
                                 )
python django
4个回答
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.iddata_available_or_not=True和所有默认值创建一个新对象。

鉴于您使用的数据库引擎支持此操作,这可能导致单个查询。如果没有,Django可以模仿它(当然,它将花费多个查询)。


2
投票

使用Django的update_or_create

obj, created = UserUsageInfo.objects.update_or_create(...)

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然后更新。


0
投票

你可以通过两种方式实现你的目标:最简单的方法是你可以使用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)
© www.soinside.com 2019 - 2024. All rights reserved.