#python #django #orm
#python #django #orm
Вопрос:
Я пытаюсь отфильтровать объекты Friendships, а затем order_by user.first_name , но это не работает. Кто-нибудь может сказать мне, что я делаю не так?
Вот мои модели:
class Friendships(models.Model):
user = models.ForeignKey('Users', models.DO_NOTHING, related_name="usersfriend")
friend = models.ForeignKey('Users', models.DO_NOTHING, related_name ="friendsfriend")
created_at = models.DateTimeField(blank=True, null=True)
updated_at = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'friendships'
class Users(models.Model):
first_name = models.CharField(max_length=45, blank=True, null=True)
last_name = models.CharField(max_length=45, blank=True, null=True)
created_at = models.DateTimeField(blank=True, null=True)
updated_at = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'users'
Мой запрос выглядит следующим образом, который возвращает мои необходимые дружеские связи, но порядок неправильный. Я перепробовал несколько различных комбинаций и примеров, но просто не уверен, что я неправильно понимаю:
Мой запрос в моем контроллере:
ordered_friends = Friendships.objects.filter(user__id=1).order_by('user__first_name')
for ordered_friend in ordered_friends:
print ordered_friend.friend.first_name, ordered_friend.friend.last_name
Обратите внимание, я пробовал несколько комбинаций вместо user__first_name
, и я знаю, что это то, где я терплю неудачу.
Ответ №1:
Неправильным является не ваш порядок, а то, что вы делаете с результатами. Давайте рассмотрим следующее, в частности строку 3
ordered_friends = Friendships.objects.filter(user__id=1).order_by('user__first_name')
for ordered_friend in ordered_friends:
print ordered_friend.friend.first_name, ordered_friend.friend.last_name
У ordered_friend
вас есть экземпляр FriendShip
каждого ordered_friend, который возвращается вам в этом ordered_friend
имени пользователя. Но, получив an ordered_friend
, вы затем делаете ordered_friend.friend
, но это не тот столбец, по которому вы упорядочиваете, поэтому неудивительно, что элементы не печатаются в алфавитном порядке. Вы, вероятно, хотели сделать
print ordered_friend.user.first_name, ordered_friend.user.last_name
или, возможно, вы изначально намеревались сортировать по друзьям?
Friendships.objects.filter(user__id=1).order_by('friend__first_name')
Комментарии:
1. e4c5 — Спасибо, вы совершенно правы, что я по ошибке заказал неправильное значение столбца в моем операторе ord … Я имел
.order_by('friend_first_name')
в виду, чтобы я мог сортировать по другу. Вы понятия не имеете, какая это была огромная помощь, большое вам спасибо за ваш полный ответ, включая вашу гипотезу в конце (вы попали в точку)! // edit: я изо всех сил пытался убедиться, что мое двойное подчеркивание.order_by('<foreign_key>__<column_value>')
выполняется, но я не увидел, что я смотрю не в тот столбец 🙂2. Рад, что помог