Django:搜索查询不存在错误

时间:2019-01-14 19:22:26

标签: django django-models

我正在尝试比较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}}

3 个答案:

答案 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