Django嵌套QuerySet

ivh*_*ivh 5 python django django-models django-queryset

我有一个像这样的Django数据模型(省略数据字段):

class Atom(Model):
    pass

class State(Model):
    atom = ForeignKey(Atom)

class Transition(Model):
    atom = ForeignKey(Atom)
    upstate = ForeignKey(State,related_name='uptrans')
    lostate = ForeignKey(State,related_name='lotrans')
Run Code Online (Sandbox Code Playgroud)

当我查询时,要限制的字段可以在任一模型中,因此最容易查询,Transition.objects.filter(...)因为可以通过外键到达其他模型中的所有字段.我们调用生成的QuerySet t.

现在我想要的是aAtom模型的QuerySet ,它对应于t,可以这样做a = t.values('atom').distinct().到现在为止还挺好.

但是,我还希望每个条目a都有一个属性/字段,用于保存此Atom状态的QuerySet,仍然t通过其中一个upstatelostateForeignKeys 反映原始选择的条件.

我已经建立了我对国家的QuerySet到现在通过遍历t,添加values('upstate_id')values('lostate_id')给一个Python set()扔了重复,然后用这个列表查询国家.但后来我无法在Atoms中实现状态的嵌套结构.

如果可能的话,任何有关如何执行此操作的建议都是受欢迎QuerySet的,因为我将它们传递给模板而不是生成器(yield语句),这是一种流式传输大量数据的好方法.

ivh*_*ivh 2

我认为以下函数执行我上面描述的操作,但我不确定按原子进一步过滤原始 QuerySet 的循环是否是正确的方法。

def getAtomsWithStates(t):
    atom_ids = set( t.values_list('atom_id',flat=True) )
    atoms = Atoms.objects.filter(pk__in=atom_ids)
    for atom in atoms:
        upstate_ids = t.filter(atom=atom).values_list('upstate_id',flat=True)
        lostate_ids = t.filter(atom=atom).values_list('lostate_id',flat=True)
        all_ids = set( upstate_ids + lostate_ids )

        # attach the new QuerySet to the entry in the outer one:
        atom.States = State.objects.filter(pk__in=all_ids)

    return atoms
Run Code Online (Sandbox Code Playgroud)

现在我可以像这样执行我需要的嵌套循环:

someAtoms = getAtomsWithStates( Transition.objects.filter(...) )
for atom in someAtoms:
    for state in atom.States:
        print state.field
Run Code Online (Sandbox Code Playgroud)

但是,再一次,可能有一个更聪明的解决方案,我肯定会感兴趣。