【问题标题】:Django: Query to get User.usernames via foreign keyDjango:通过外键查询获取 User.usernames
【发布时间】:2012-12-27 20:22:42
【问题描述】:

考虑以下友谊模型,其中每建立一个友谊,都有一个用户发送好友请求,以及一个接收好友请求的用户: p>

from django.contrib.auth.models import User

class Friendship(models.Model):
    sender = models.ForeignKey(User)
    receiver = models.ForeignKey(User)

我将如何构建一个查询,以提供与 user123 建立友谊的用户的所有用户名

请记住,user123 可能是他所在的任何友谊的发送者或接收者。

另外,我只希望返回 User.username 值,而不是整个 User 对象。


到目前为止,我有这个笨重的一半/解决方案(我正在使用 list() 以便我可以添加 user123 的接收朋友和 user123 的 发送朋友最终生成所有朋友的列表)。问题是,我得到了所有的用户对象,而我只想要用户名......而且必须有更好的方法来做到这一点。

friends_a = list(Friendship.objects.filter(sender=user123).values('receiver'))
friends_b = list(Friendship.objects.filter(receiver=user123).values('sender'))
friends_a = [] if not friends_a else friends_a[0].values()
friends_b = [] if not friends_b else friends_b[0].values()
all_friends = friends_a + friends_b

【问题讨论】:

    标签: python django django-models foreign-keys


    【解决方案1】:

    Q Objects for complex lookups.

    哇,因为实际上有 2 个不同的逻辑查询,所以获得您想要的结果集真是令人惊讶。最简单的方法是……用python拼出来。

    user = User.objects.get(username='user123')
    friendships = Friendship.objects.filter(Q(receiver=user) | Q(sender=user))
    
    usernames = []
    
    for friendship in friendships:
        if friendship.receiver == user:
            usernames.append(friendship.receiver.username)
        else:
            usernames.append(friendship.sender.username)
    

    【讨论】:

    • 该死,干得好。希望我可以通过一个复杂的查询来实现它,但这绝对可以完成工作。
    猜你喜欢
    • 2014-01-08
    • 2016-04-17
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多