【问题标题】:Django models queryDjango 模型查询
【发布时间】:2017-08-10 06:50:28
【问题描述】:

我有一个类似的 django 模型

留言:
来自:
消息:

问题是当我必须显示两个特定用户之间的消息时,我必须检查存储在数据库中的所有消息并检查 messageto 和 messagefrom 字段。

我使用 django 的方式就像每个模型代表一个表,并且对应于模型类的每个对象,我们在数据库中都有一行。

所以根据这个逻辑,我认为不可能为每个 messageto 和 messagefrom 组合创建一个单独的表,因为我们需要为它们中的每一个声明一个单独的类。

有没有一种方法可以在不查看每条消息的情况下找到用户之间的消息?

我正在寻找具有相同实现的某种方式或任何新的实现都可以。

请帮忙。

【问题讨论】:

    标签: django database django-models chat


    【解决方案1】:

    数据库不会遍历所有内容。它使记录保持索引。

    你可以有一个用户模型(如果没有,django 提供了一个默认的用户模型)。

    class Users(models.Model):
        # all the fields you want for a user(username, password, email,etc..)
        message_exchanged=models.ManyToManyField(Messages,through='MessageMap',through_fields=('messagefrom','message'))
    

    那么你可以有一个类来存储消息。

    class Messages(models.Model):
        message_text=models.TextField()
        #other fields you want to add for a message
    

    这里有你的 MessageMap 模型

    class MessageMap(models.Model):
    messagefrom=models.ForeignKey(Users)
    message=models.ForeignKey(Message)
    messageto=models.ForeignKey(User,related_name='next_messsage',null=True,blank=True)
    

    一旦您存储了消息。您可以使用

    查询消息
    messages=Message.objects.filter(Q(messagefrom = from_user),Q(messageto=to_user))
    

    【讨论】:

      【解决方案2】:

      一种方法是使用 Q 对象来解决该问题。如果您的模型名为 Message,您可以使用以下查询在两个用户 A 和 B 之间交换所有消息:

      Message.objects.filter(Q(messageto=A, messagefrom=B)|Q(messageto=B, messagefrom=A))

      有关 Q 对象的更多详细信息,请参阅https://docs.djangoproject.com/en/1.10/topics/db/queries/#complex-lookups-with-q-objects

      【讨论】:

      • 但是即使数据库返回它们,它仍然会在遍历所有内容后返回,对吗?所以无论是我在视图中迭代还是在数据库中迭代,它应该会更好但仍然不够好,对吧?
      猜你喜欢
      • 2015-07-13
      • 1970-01-01
      • 2012-12-15
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多