2011-06-03 87 views
0

我有一个类的形式为:排序,并从模型计算匹配字段的Django

class data: 
    person.models.foreignKey("people.person") 
    place.models.foreignKey("places.place") 

,我试图创建一个包含有与他们有多少连接具有相关联的同一人的地方的字典。 IE:

dict={[place1:place2]:count} 

所以字典看起来可能是这样:

dict={[place1:place2]:3, [place1:place3]:2, ect} 

到目前为止我有:

dict={} 
datas=data.objects.all() 

for data1 in datas: 
    for data2 in datas: 
     # if dict is empty 
     if not dict and data1.person == data2.person and data1.place != data2.place: 
      dict[(data1.place, data2.place)]=1 
     elif data1.person == data2.person and data1.place != data2.place: 
      for assoc, count in dict.items(): 
       if assoc == (data1.place, data2.place) or assoc == (data2.place, data1.place): 
        count +=1 
       else: 
        dict[(data1.place, data2.place)]=1 
     else: 
      dict[(data1.place, data2.place)]=1 

目前这回完全错误的关系,从来没有递增计数。我究竟做错了什么?

回答

3

不要使用预定义像你的变量字典。认为你的问题是你想增加计数变量,而你必须增加字典[键] - 例如字典[键] + = 1

dct = {} 
datas = data.objects.all() 

for data1 in datas: 
    for data2 in datas: 
     # if dict is empty 
     if not dct and data1.person == data2.person and data1.place != data2.place: 
      dct[(data1.place, data2.place)] = 1 
     elif data1.person == data2.person and data1.place != data2.place: 
      if (data1.place, data2.place) in dct: 
       dct[(data1.place, data2.place)] += 1 
      elif (data2.place, data1.place) in dct: 
       dct[(data2.place, data1.place)] += 1 
      else: 
       dct[(data1.place, data2.place)] = 1 
     else: 
      dct[(data1.place, data2.place)] = 1 
+0

这似乎是在正确的轨道上。但是'dct [(data1.place,data2.place)] + = 1'会导致KeyError。任何方法来解决这个问题? – 2011-06-03 15:34:56

+0

我已经添加了elif语句来处理这种情况。然而,如果(data1.place,data2.place)和(data2.place,data1.place)是相同的,那么你需要修改代码来考虑这一点 – 2011-06-03 15:37:58

1

使用注释。我没有你的模型布局,所以这是一个近似的逻辑。你需要调整它根据您的实现,以映射到正确的东西:

from django.db.models import Count 
places = Place.objects.filter(people=thisguy).annotate(connections=Count('people')) 

然后你就可以得到通过连接的每个地点的属性计数:

places[0].connections