Сортировка и подсчет совпадающих полей из модели Django - PullRequest
0 голосов
/ 03 июня 2011

У меня есть класс вида:

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

в настоящее время это возвращает абсолютно ошибочные отношения и никогда не увеличивает счет Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Не используйте предопределенные имена, такие как dict для ваших переменных.Подумайте, что ваша проблема в том, что вы пытаетесь увеличить переменную count, в то время как вам нужно увеличить dict [ключ] - например, dict [ключ] + = 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
1 голос
/ 03 июня 2011

Используйте аннотации.У меня нет макета вашей модели, так что это приблизительная логика.Вам нужно настроить его так, чтобы он соответствовал нужным вещам на основе вашей реализации:

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

Затем вы можете получить количество подключений через атрибут в каждом месте:

places[0].connections
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...