Если предположить, что отношения являются односторонними, от U1 до U2, то все просто:
select u.*
from relationships r
inner join users u on r.u2_fk = u.id
where r.u1_fk = ?
Я понятия не имею, что означает действие или статус.
Что-то, что сделало бы это более понятным, это если вы сделаете свое поле дБ более описательным в таблице отношений: то есть user_id и friend_id. Тогда становится очевидным, что вы хотите присоединить файл Relations.friend_id к user.id и отфильтровать по параметру Relations.user_id
Затем вы можете дополнительно выполнить фильтрацию по статусу и т. Д. добавив желаемые результаты, я вижу, что вы хотите включить в результаты как u1_fk, так и u2_fk. Это, конечно, можно сделать, но вы делаете это гораздо более запутанным, ИМО.
Я бы предложил, чтобы, когда дружба была принята, создала новую линию для нового друга. Таким образом, когда вы хотите найти всех друзей для пользователя, вам нужно только сопоставить u1_fk (то есть, user_id), а другом всегда будет u2_fk (friend_id).
Затем каждый друг может независимо контролировать, как они хотят общаться, т.е. вы можете заблокировать меня или я могу заблокировать вас. - мои два цента стоят. Заставьте свою ассоциацию делать одно.
Может быть полезно взглянуть на схему:
User Relationship User
id
id ----> u1_fk
u2_fk <------- id
Это было бы легко понять. Но то, что вы хотите из этого, больше похоже на
User Relationship User
id
id -----> u1_fk <------ id
\---> u2_fk <---/
Итак, для начала, я смотрю на это с точки зрения фильтрации по отношениям, а затем добавляю информацию о пользователях по мере их соответствия:
select r.id, r.u1_fk, r.u2_fk,
coalesce(u1.user_id, u2.user_id) userid,
coalesce(u1.username, u2.username) username,
coalesce(u1.user_picture, u2.user_picture) picture
from relationship r
left join user u1 on r.u1_fk = u1.id
left join user u2 on r.u1_fk = u2.id
where u1_fk = ? or u2_fk = ?
но это означает, что вам придется объединять поля из u1 и u2.
Другое решение состояло бы в том, чтобы начать с пользователя, объединить все возможные отношения и объединить его с пользователями, которые не являются пользователем, с которым вы начали (элегантное решение GMB)
Однако, что происходит если у вас есть:
id u1_fk u2_fk
1 2
2 1
Я думаю, что оба решения дадут вам дублирующий список.
Вот почему я настоятельно рекомендую вам переименовать (по крайней мере, в вашей голове) u1_fk
и u2_fk
в user_id
и friend_id
.
Я сделал обоих, и Apache/mod_python имел тенденцию быть легче работать с и более стабильный. Но в эти дни я перепрыгнул к Apache/mod_wsgi, который является всем, что я когда-либо хотел и больше:
.wsgi
файл для перезагрузки вместо того, чтобы перезапустить Apache). lighttpd с FastCGI будет номинально быстрее, но действительно время, которое требуется для выполнения кода Python и любых хитов базы данных, которые он делает, идет в абсолютно карликовый любой выигрыш в производительности, который Вы получаете между веб-серверами.
mod_python и апач дадут Вам немного больше гибкости, мудрой функцией, если Вы захотите написать код за пределами django, который действительно наполняет как автор обзора или любое необычное получение/установка HTTP-заголовка. Возможно, Вы хотите использовать другие встроенные функции апача, такие как mod_rewrite.
, Если память является беспокойством, избегая, форма apache/mod_python поможет много. Apache имеет тенденцию использовать много RAM, и код mod_python, который склеивает во всю апачскую функциональность, занимает большое пространство памяти также. Не говоря уже о природе мультипроцесса апача имеет тенденцию съедать больше RAM, когда каждый процесс растет до размера, он - самый интенсивный запрос.
Я использую его с nginx., не уверенным, если это действительно быстрее, но конечно меньше RAM/загрузки ЦП. Также легче работать, несколько процессов Django и иметь nginx отображают каждый префикс URL на различный сокет. все еще в полной мере пользование memcached модулем nginx, но сначала тестирует шоу огромный преимущество скорости.
Существует также mod_wsgi, это, кажется, быстрее, чем mod_python и режим демона работают подобный FastCGI
Лично у меня был он работающий с FastCGI в течение некоторого времени теперь (приблизительно 6 месяцев), и время отклика 'кажется' более быстрым при загрузке страницы тот путь по сравнению с модификацией ___ Python. Критическая причина для меня, хотя то, что я не мог видеть очевидный способ сделать несколько сайтов от тех же апачей / mod_python установка, тогда как FastCGI был относительной легкой задачей.
я не провел особенно полных экспериментов, хотя :-)
[Редактирование] Разговор на основе опыта, хотя, создавая FastCGI может быть что-то вроде, причиняет боль в первый раз вокруг. Я продолжаю означать писать руководству..!
Я рекомендовал бы конфигурации WSGI; я продолжаю означать угробить апача, но всегда существует некоторое приложение прежней версии на сервере, который, кажется, требует его. Кроме того, экология приложения WSGI очень разнообразна, и она позволяет аккуратные приемы, такие как объединение в гирляндную цепь WSGI "промежуточное программное обеспечение" между сервером и приложением.
Однако в настоящее время существуют известные проблемы с некоторыми приложениями и апачским mod_wsgi, особенно некоторые ctypes приложения, так быть осторожным, при попытке работать, скажем, geodjango, который использует ctypes экстенсивно. Я в настоящее время работаю вокруг тех проблем путем возвращения к fastcgi сам.