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通过其中一个upstate或lostateForeignKeys 反映原始选择的条件.
我已经建立了我对国家的QuerySet到现在通过遍历t,添加values('upstate_id')并values('lostate_id')给一个Python set()扔了重复,然后用这个列表查询国家.但后来我无法在Atoms中实现状态的嵌套结构.
如果可能的话,任何有关如何执行此操作的建议都是受欢迎QuerySet的,因为我将它们传递给模板而不是生成器(yield语句),这是一种流式传输大量数据的好方法.
我认为以下函数执行我上面描述的操作,但我不确定按原子进一步过滤原始 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)
但是,再一次,可能有一个更聪明的解决方案,我肯定会感兴趣。