在Django中,如何在跨表时使用order_by()?

时间:2016-10-04 04:32:14

标签: 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 个答案:

答案 0 :(得分:2)

这不是你的命令错误,而是你对结果做了什么。让我们消化以下内容,特别是第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的用户名返回给您。但是,在获得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')