В Django, как мне order_by() при доступе к таблицам?

#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. Рад, что помог