我正在尝试比较2个列表,其中一个是从数据库中拉出的,第二个是正在与之比较的列表,然后使用正确的信息更新数据库字段。请注意,以下代码是为了简洁起见,以证明概念。
does not work when first item on second list differes
db_list['D01', 'D02', 'D03', 'D04', 'D05', 'D06']
second_list['XY12','D01','VA02','HM01','D04','HM03','D126']
does work when first item on second list matches db_list
db_list['D01', 'D02', 'D03', 'D04', 'D05', 'D06']
second_list['D01','XY12','VA02','HM01','D04','HM03','D126']
问题是,如果在比较db_list时second_list中的第一项与某项不匹配,则会引发错误“用户匹配查询不存在”。但是,如果second_list中的第一项包含db_list中已经存在的一项,则代码将完美执行。甚至更新了second_list中尚未在数据库中的条目。进行这种比较时,为什么第一个元素必须匹配,这使我感到困惑。
tl; dr:
second_list = ['XY12','D01','VA02','HM01','D04','HM03','D126']
for each in second_list:
# verify if the user exists in DB first if not create
if User.objects.filter(username=each).exists():
# the print is for console logging/tshoot
print(f'{each} exists. updating..')
model = User.objects.get(username=each)
model.last_seen = timezone.now()
model.save()
else:
# the print is for console logging/tshoot
print(f'{each} does not exists. creating')
model = User()
gg = gg()
model.username = each
model.last_seen = timezone.now()
model.gg = GG.objects.get(gg='IG123')
model.save()
在我的初始代码中,我从数据库中获取数据,并将其与用于创建新数据库条目的新列表进行比较。这种方法令人困惑,而且重复工作。因此,我们现在仅验证条目是否首先存在于数据库中并进行更新,或者我们创建一个新条目。下面的代码很简单,并且可以正常工作。
{{1}}
答案 0 :(得分:1)
在我的初始代码中,我从数据库中获取数据,并将其与用于创建新数据库条目的新列表进行比较。这种方法令人困惑,而且重复工作。因此,我们现在仅验证条目是否首先存在于数据库中并进行更新,或者我们创建一个新条目。下面的代码很简单,并且可以正常工作。
second_list = ['XY12','D01','VA02','HM01','D04','HM03','D126']
for each in second_list:
# verify if the user exists in DB first if not create
if User.objects.filter(username=each).exists():
# the print is for console logging/tshoot
print(f'{each} exists. updating..')
model = User.objects.get(username=each)
model.last_seen = timezone.now()
model.save()
else:
# the print is for console logging/tshoot
print(f'{each} does not exists. creating')
model = User()
gg = gg()
model.username = each
model.last_seen = timezone.now()
model.gg = GG.objects.get(gg='IG123')
model.save()
答案 1 :(得分:0)
我完全无法理解您要使用if second_list.count(db_list[cc])
做的事情,或者甚至是cc
所做的事情。如果要检查元素是否在db_list中,则只需执行if each in db_list
。
但是,您的整个代码可以大大简化。
gg = GG.objects.get(gg='IG07')
for item in second_list:
obj, created = User.objects.get_or_create(username=item, defaults={'gg': gg, 'last_seen': timezone.now())
if not created:
item.last_seen = timezone.now()
item.save()
答案 2 :(得分:0)
您可以对第二个列表中的每个项目执行get_or_create()。您的代码可能看起来像这样:
second_list = ['XY12','D01','VA02','HM01','D04','HM03','D126']
for each in second_list:
user, created = User.objects.get_or_create(username=each)
if created:
gg = gg()
user.gg = gg
user.last_seen = timezone.now()
user.save()
get或create函数将在您的数据库中检查用户是否已经存在。如果不是,则创建的变量将等于True,它将使用您用于查询数据库的用户名为您创建一个新的用户对象,并分配给第一个变量(在本例中为用户)。如果用户已经存在,则该对象也将分配给变量user,但是创建的变量将为False