Estoy tratando de crear una lógica en Django que verifique si el Usuario ya ha proporcionado cierta información. Si no, crea un nuevo objeto y lo guarda en la base de datos. Y la información ya estaba allí, luego actualiza el mismo objeto con la nueva información. Estoy cometiendo un error porque puede crear un nuevo objeto pero no lo actualiza .

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
                                 )
1
Hannan 4 mar. 2018 a las 21:58

4 respuestas

La mejor respuesta

Puede usar QuerySet.update_or_create para esto:

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,
                                        })

Así que aquí usamos user_id=request.user.id como filtro, así como data_available_or_not=True. En caso de que exista, actualizamos con defaults, de lo contrario, creamos un nuevo objeto con user_id=request.user.id, data_available_or_not=True y todos los valores predeterminados.

Dado que el motor de base de datos que utiliza admite esta operación, este puede generar una sola consulta. Si no, Django puede emularlo (por supuesto, costará múltiples consultas).

1
Willem Van Onsem 5 mar. 2018 a las 12:08
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
                                 )

El problema está en otra parte, donde necesitas usar 1st get y luego actualizar.

0
sonus21 4 mar. 2018 a las 19:13

Puede lograr su objetivo de dos maneras: La manera más simple es que puede usar método update_or_create () django proporciona el método update() para el conjunto de consultas que significa que, en lugar de usar get (), debe usar el filtro y luego actualizar los datos de la siguiente manera:

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)
0
Gahan 4 mar. 2018 a las 19:15

Utilice update_or_create de Django. para esto.

obj, created = UserUsageInfo.objects.update_or_create(...)
2
wim 4 mar. 2018 a las 19:11