django - 如何分离查询集?

时间:2013-11-29 22:44:05

标签: django django-models django-orm

我正在用户之间创建一个消息传递应用程序。希望完全有了帮助,我想出了业务逻辑,我认为会有效。所以现在,我可以发送消息并获取特定用户(例如A)的所有消息(发送和接收)。但是我被各个用户查询或分离这些消息(A的所有发送/接收消息)(例如A和B发送/接收的消息,A和C发送/接收的消息)。下面是我的models.py。请看看,请帮助我。或者,如果有更好的出路请告诉我。将不胜感激。谢谢。

models.py

class Thread(models.Model):
    sender = models.ForeignKey(User, related_name="sender_set")
    recipient = models.ForeignKey(User, related_name="recipient")
    message = models.TextField()
    date = models.DateTimeField(default=datetime.now)

# To get all the messages of A
>>> conversation = Thread.objects.filter(Q(sender=A) | Q(recipient=A))
[<Thread: A to B><Thread: C to A><Thread: B to A><Thread: A to C><Thread: A to B>]

如何为每个用户分别conversation?希望我已经清楚了。谢谢。

2 个答案:

答案 0 :(得分:1)

我鼓励你不要重新发明轮子。我最近有类似的任务,我发现简单地采用优秀的user_messages项目中的代码非常容易。为了采纳和理解我在做什么,我需要了解所使用的数据库模型,具体如下:

enter image description here

基本上你的User模型(无论是标准模型还是覆盖标准模型的模型)都具有:

  • 1:N(一对多)Message
  • 1:N(一对多)UserThread

Thread有1:N UserThread,这样可以很容易地将消息分组到线程下,具体取决于您显示线程的用户。

以这种方式对数据建模使得为每个用户(您提出的问题)检索单独的对话是微不足道的。

请查看他们的models.py及相关managers.py。您将意识到他们已做出的良好设计决策并将其纳入代码中。我不得不自己扩展它,因为它不能满足我的所有用例。但我确实觉得很容易扩展。

顺便说一句:我通过使用非常有用的django packages already available for messages网站查看djangopackages.com找到了user_messages

答案 1 :(得分:0)

(eg. messages sent/received by A and B, messages sent/received by A and C)

如果我理解你的问题;你想要的是获得2个用户(发送或接收)之间的所有消息。因此,根据您的模型设计,这两个查询可以为您提供所需的内容:

c1 = Thread.objects.filter(sender=A, recipient=B)
c2 = Thread.objects.filter(sender=B, recipient=A)

total = list(c1) + list(c2) # this will give you all messages between A and B

您可以创建一个函数来为多个特定用户处理此问题:

def separate_messages(user1, user2):
    c1 = Thread.objects.filter(sender=user1, recipient=user2)
    c2 = Thread.objects.filter(sender=user2, recipient=user1)

    total = list(c1) + list(c2)
    return total

users = [B, C, D, E]
const_user = A

for user in users:
    print separate_messages(const_user, user)