簡體   English   中英

Django通過表屬性查詢

[英]Django querying with Through table properties

我目前正在構建一個具有好友功能的Web應用程序(例如Facebook等)。

當朋友發送朋友請求時,將使用accepted = False創建一個友誼對象。 當所請求的朋友接受請求時, accepted設置為True

這是我的模型(大大簡化了):

class Friendship(models.Model):
    sender = models.ForeignKey('Person', related_name='sender')
    receiver = models.ForeignKey('Person', related_name='receiver')
    accepted = models.BooleanField(default=False)

class Person(models.Model):
    person = models.OneToOneField(User)
    friends = models.ManyToManyField('self', through=Friendship)

我這樣子,所以我也可以管理朋友的請求。

現在,假設我有一個人約翰。 我想得到所有John的朋友(例如,所有接受John的朋友請求的朋友,以及所有其朋友請求John的朋友接受)。

這是我現在的做法:

def friends(person):
    friends = Friendship.objects.filter(sender=person, accepted=True) | Friendship.objects.filter(receiver=person, accepted=True)
    friends = [friendship.sender for friendship in friends if friendship.sender != person] + \
              [friendship.receiver for friendship in friends if friendship.receiver != person]
    return friends

在我看來,這似乎很丑陋,可能很慢且效率低下。 Django有做這種事情的方法嗎?

def friends(person):
    return person.friends.filter(accepted=True)

不幸的是,這個確切的代碼不起作用。 有沒有更好的辦法?

我最近不得不運行一個非常相似的查詢。 這樣的東西(或類似的東西)應該起作用:

def friends(person):
    friends = Person.objects.filter(Q(sender__receiver=person, sender__accepted=True) | Q(receiver__sender=person, receiver__accepted=True))
    return friends

您可以使用M2M模型的Person.objects.filter(sender__accepted=True)屬性在相關字段上進行Person.objects.filter(sender__accepted=True) ,例如Person.objects.filter(sender__accepted=True)

友誼關系中的另一個人是“朋友”。 即,如果您是接收者,則朋友是發送者,反之亦然。 我還將重命名相關的名稱“發送者”和“接收者”,並在其前面加上“朋友”,因此上面的查詢更加清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM