2013-01-13 21 views
5
ngoại

Hãy xem xét các mô hình sau Bạn bè, nơi cho mọi tình bạn thực hiện, có một tài khoản người gửi các yêu cầu kết bạn, và một tài khoản người nhận các yêu cầu kết bạn:Django: Query để có được User.usernames qua phím

from django.contrib.auth.models import User 

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

Làm thế nào tôi sẽ xây dựng một truy vấn mà sẽ cho tôi tất cả các tên người dùng của người dùng đang ở trong một Hữu nghị với, nói, user123?

Hãy ghi nhớ, user123 có thể là người gửi hay người nhận của bất kỳ hệ hữu nghị ông đang ở trong.

Ngoài ra, tôi chỉ muốn các giá trị User.username để được trả lại, không phải là một toàn bộ đối tượng người dùng.


Cho đến nay, tôi có điều này nửa clunky/giải pháp (Tôi đang sử dụng list() vì vậy mà tôi có thể thêm cả của user123 nhận bạn bè và user123 của gửi bạn bè, để cuối cùng tạo ra một danh sách của tất cả các bạn bè) . Vấn đề là, tôi nhận được tất cả các đối tượng User, và tôi chỉ muốn tên người dùng ... và có một cách tốt hơn để làm điều này.

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 

Trả lời

4

Q Objects for complex lookups.

Wow, điều này đáng ngạc nhiên là một bender tâm để có được kết quả thiết lập bạn muốn vì có thực sự là 2 truy vấn logic khác nhau. Cách đơn giản nhất là ... đánh vần nó bằng 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) 
+0

Thiệt, làm tốt. Đã hy vọng tôi có thể đạt được nó với một truy vấn phức tạp duy nhất, nhưng điều này chắc chắn được thực hiện công việc. – sgarza62

Các vấn đề liên quan