Запрос моделей Django - PullRequest
       8

Запрос моделей Django

0 голосов
/ 19 июля 2011

Я пытаюсь создать запрос, используя модели django. У меня 4 модели. Функциональность заключается в том, чтобы отображать всех друзей этого человека на Facebook, которые еще не являются друзьями и не ожидают запроса о дружбе.

CustomUserFriends

идентификатор, from_customuser_id, to_customuser_id,

FacebookProfile

идентификатор, facebook ID, custom_user_id

CustomUser

идентификатор, имя

FriendRequests

идентификатор, запрашивающий (user_id запрашивающего лица), requesttee (user_id запрашиваемого лица),

Теперь у меня есть список идентификаторов facebook в качестве примера переменной

facebook_ids = [12123,45433,455664,44445]

По сути, запрос, который я пытаюсь создать с помощью моделей django, состоит в том, чтобы выбрать всех пользователей, которые имеют идентификатор facebook в таблице facebookprofile, но не имеют отношения дружбы с пользователем или ожидающего запроса о дружбе.

Друг определяется как имеющий 2 записи в таблице CustomUserFriends, пример

дружеские отношения

CustomUsers

ID

1

2

CustomUserFriends

id от_custom_user_id до_custom_user_id

1 1 2

2 2 1

1 Ответ

0 голосов
/ 19 июля 2011

Итак, я не был полностью уверен, чего вы пытались достичь здесь. Это был случай, когда нужно было найти всех не-друзей для конкретного пользователя или иметь конкретного пользователя и попытаться найти всех его друзей, которые не были друзьями друг с другом. Я решил, что сделаю и то, и другое, и позволю тебе решить, какой ты хочешь.

Во-первых, есть две функции. Одна из них - основная функция, которую мы будем использовать, другая - просто для отображения информации.

def get_non_friends_for_user(u, friend_ids_filter=[]):

    # Search the friends lists
    friend_ids = list(CustomUserFriends.objects.filter(
        from_customuser_id=u.pk).values_list('to_customuser_id', flat=True))
    friend_ids += list(CustomUserFriends.objects.filter(
        to_customuser_id=u.pk).values_list('from_customuser_id', flat=True))

    # Search the requests lists
    friend_ids += list(FriendRequests.objects.filter(
        requester=u.pk).values_list('requestee', flat=True))
    friend_ids += list(FriendRequests.objects.filter(
        requestee=u.pk).values_list('requester', flat=True))

    non_friends = CustomUser.objects.exclude(id__in=friend_ids)
    if friend_ids_filter:
        non_friends = non_friends.filter(id__in=friend_ids_filter)
    return non_friends

def display_user_info(cu, non_friends):
    print
    print cuf.name
    for non_friend in non_friends:
        print '\t', non_friend.name

Теперь, чтобы получить всех людей, которые не являются друзьями определенного пользователя, мы просто используем эту функцию

# Get all non-friends for custom_user
# Note that custom_user should be defined before as a CustomUsers object
non_friends = get_non_friends_for_user(custom_user)
display_user_info(custom_user, non_friends)

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

# Again, custom_user must already be defined as a CustomUsers object
custom_user_non_friends = {}
custom_user_friends = CustomUserFriends.objects.filter(
    from_customuser_id=custom_user.pk)
friend_ids = list(custom_user_friends.values_list('to_customuser_id', flat=True))
for cuf in custom_user_friends:
    cu = cuf.to_customuser_id

    # Add the queryset to the dictionary
    custom_user_non_friends[cu] = get_non_friends_for_user(cu, friend_ids)

for cu, non_friends in custom_user_non_friends.items():
    display_user_info(cu, non_friends)

И это должно сделать это. Я не проверял ничего из этого, и все это в значительной степени исходит из моей головы, поэтому могут быть некоторые ошибки. Если это не работает для вас или это не то, что вы искали, просто оставьте комментарий, и я посмотрю, что я могу сделать.

...