Python 在Django中按属性组合两个模型的最快方法

Python 在Django中按属性组合两个模型的最快方法,python,django,performance,Python,Django,Performance,我有两个模型,它们有一个共同的属性,我希望有两个模型将它们组合起来。如果两个模型中的属性相等,则每个模型从不同的数据库获取数据: 第一个模型 第二种模式 例子 如果我有: lists_users = [<User: 123>, <User: 2345>,<User:567>] lists_users_moodle = [<UserMoodle:123>, <UserMoodle:2345>, <UserMoodle:897>

我有两个模型,它们有一个共同的属性,我希望有两个模型将它们组合起来。如果两个模型中的属性相等,则每个模型从不同的数据库获取数据:

第一个模型 第二种模式 例子 如果我有:

lists_users = [<User: 123>, <User: 2345>,<User:567>]
lists_users_moodle =  [<UserMoodle:123>, <UserMoodle:2345>, <UserMoodle:897>]
列出用户=[,]
列出用户\u moodle=[,]
我希望将它们结合起来,得到以下结果:

combined_models_lists = [[<User: 123>, <UserMoodle: 123>], [<User: 2345>, <UserMoodle: 2345>], [<User: 567>, None],[None, <UserMoodle: 897>]]
组合模型列表=[,],[,],[,无],[无]

提前谢谢

一种方法是首先从这些列表(或QuerySet)创建dict,然后迭代这些dict的键的并集以获得所需的输出:

dict_users = {x.matricula : x for x in lists_users}
dict_moodle = {x.matricula : x for x in lists_users_moodle}

combined_models_lists  = [[dict_users.get(x), dict_moodle.get(x)] 
                                          for x in set(dict_users).union(dict_moodle)]

另一种方法是迭代每个QuerySet的排序版本,然后填充一个列表,这样与上述方法相比,我们将使用更少的内存:

users = User.objects.all().order_by('matricula') #order by field `matricula`
moodles = UserMoodle.objects.all().order_by('matricula')

out = []

it1 = iter(users)
it2 = iter(moodles)

prev1 = next(it1)
prev2 = next(it2)

while True:
    if prev1.matricula  == prev2.matricula:
        out.append([prev1, prev2])
        try:
            prev1 = next(it1)
            prev2 = next(it2)
        except StopIteration:
            out.extend([x, None] for x in it1)
            out.extend([None, x] for x in it2)
            break

    if prev1.matricula  < prev2.matricula :
        out.append([prev1, None])
        try:
            prev1 = next(it1)
        except StopIteration:
            out.append([None, prev2])
            out.extend([None, x] for x in it2)
            break

    if prev1.matricula  > prev2.matricula :
        out.append([None, prev2])
        try:
            prev2 = next(it2)
        except StopIteration:
            out.extend([prev1, None])
            out.extend([x, None] for x in it1)
            break
users=User.objects.all().order_by('matricula')#order by field`matricula`
moodles=UserMoodle.objects.all().order_by('matricula')
out=[]
it1=国际热核实验堆(用户)
it2=国际热核实验堆(moodles)
prev1=下一个(it1)
prev2=下一个(it2)
尽管如此:
如果prev1.matricula==prev2.matricula:
out.append([prev1,prev2])
尝试:
prev1=下一个(it1)
prev2=下一个(it2)
除停止迭代外:
out.extend([x,None]表示it1中的x)
out.extend([None,x]表示it2中的x)
打破
如果prev1.matriculaprev2.matricula:
out.append([None,prev2])
尝试:
prev2=下一个(it2)
除停止迭代外:
out.extend([prev1,None])
out.extend([x,None]表示it1中的x)
打破
dict_users = {x.matricula : x for x in lists_users}
dict_moodle = {x.matricula : x for x in lists_users_moodle}

combined_models_lists  = [[dict_users.get(x), dict_moodle.get(x)] 
                                          for x in set(dict_users).union(dict_moodle)]
users = User.objects.all().order_by('matricula') #order by field `matricula`
moodles = UserMoodle.objects.all().order_by('matricula')

out = []

it1 = iter(users)
it2 = iter(moodles)

prev1 = next(it1)
prev2 = next(it2)

while True:
    if prev1.matricula  == prev2.matricula:
        out.append([prev1, prev2])
        try:
            prev1 = next(it1)
            prev2 = next(it2)
        except StopIteration:
            out.extend([x, None] for x in it1)
            out.extend([None, x] for x in it2)
            break

    if prev1.matricula  < prev2.matricula :
        out.append([prev1, None])
        try:
            prev1 = next(it1)
        except StopIteration:
            out.append([None, prev2])
            out.extend([None, x] for x in it2)
            break

    if prev1.matricula  > prev2.matricula :
        out.append([None, prev2])
        try:
            prev2 = next(it2)
        except StopIteration:
            out.extend([prev1, None])
            out.extend([x, None] for x in it1)
            break