Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更好的方法来设计消息模型?_Python_Django_Django Models - Fatal编程技术网

Python 有没有更好的方法来设计消息模型?

Python 有没有更好的方法来设计消息模型?,python,django,django-models,Python,Django,Django Models,有没有更好的方法来设计消息模型 我有一个消息模型: class Message(models.Model): """ message """ title = models.CharField(max_length=64, help_text="title") content = models.CharField(max_length=1024, help_text="content") is_read = models.BooleanField(

有没有更好的方法来设计消息模型

我有一个消息模型:

class Message(models.Model):
    """
    message
    """
    title = models.CharField(max_length=64, help_text="title")
    content = models.CharField(max_length=1024, help_text="content")

    is_read = models.BooleanField(default=False, help_text="whether message is read")

    create_user = models.ForeignKey(User, related_name="messages",help_text="creator")
    receive_user = models.CharField(max_length=1024, help_text="receive users' id")

    def __str__(self):
        return self.title
    def __unicode__(self):
        return self.title
您知道,我使用models.CharField来存储用户id,这样我就可以知道应该接收此行消息的用户

我不知道这种款式是否好。还是有更好的方法


我已经考虑过使用ManyToMany字段,但我认为如果用户太多,管理员创建一条消息将创建与用户数相同的数量,因此我认为这不是一个好主意。

我肯定会使用
ManyToManyField
来接收
用户。您将发现,使用用户ID更新和清理
CharField
将是一场噩梦,需要重新实现大量现有的Django功能

我不确定我是否理解您使用
ManyToManyField
的潜在问题,管理员用户将能够选择哪些用户将成为邮件的收件人,但不会自动为每个用户发送邮件

e:另外,根据您使用的python版本(2或3),您只需要
\uuuu str\uuuu
\uuuu unicode\uuu


\uuuuuunicode\uuuuu
是python2使用的方法,而
\uuuuuu str\uuuu
是python3使用的方法:

因此,这实际上取决于您的需要,我将在哪个方向更改您的消息模型

一般变化 根据猜测:您永远不需要
内容
字段上的索引

我会将内容更改为文本字段(因为1024的长度对于mysql上的propper索引来说已经太大了),这里有更多关于这个主题的信息

我会尽量增加
标题
字段的大小,因为这对我来说很方便

1.简单->一对一用户 单个
read
字段表示一对一消息:

我会将接收方也更改为外键,并调整
发送方
接收方
字段的相关名称,以表示这些与
发送消息
接收消息
之类的连接

就像@sebastian fleck已经建议我也将
read
字段更改为datetime字段一样,它只会将查询集从
filter(read=True)
更改为
filter(read\u isnull=False)
以获得相同的结果,并且您可以创建一个表示read为布尔值的属性以保持一致性,例如

@property
def read(self):
    return bool(self.read_datetime)  # assumed read as a datetime is read_datetime
2.更复杂:一个用户对多个用户 这可能会变得更复杂,这里是我能想到的最简单的解决方案

条件: -只有信息,没有像结构一样的对话 -对于每个接收者,消息应具有读取状态

(为了便于概述,我删除了描述,并根据我以前的意见更改了模型,这是基于我的经验以及我从您的示例和答案中假设的业务需求)

此结构使用了许多定制直通模型的强大功能,请检查此结构,它非常强大:

tldr:我们希望每个接收器都有一个读取状态,所以我们在一个单独的对象中对此进行建模

更长的版本:我们利用定制的manytomy-through模型的强大功能,为每个接收器提供单独的读取状态。这意味着我们需要更改代码的某些部分以适用于多对多结构,例如,如果我们想知道消息是否已被所有接收者读取:

def did_all_receiver_read_the_message(message)
    unread_count = my_message.receive_users.filter(is_read__isnull=True).count()
    if unread_count > 0:
        return True
    return False
如果我们想知道特定用户是否阅读特定消息:

def did_user_read_this_message(user, message)
    receiver = message.receive_users.get(receiver=user)
    return bool(receiver.is_read)
3.对话+信息+参与者 这将超出我的时间限制,但有一些简短的提示:

  • 对话
    将所有内容结合在一起
  • 消息
    参与者编写
    并保存创建的
    时间戳
  • 参与者
    允许访问对话,并将
    用户
    链接到
    对话
    对象
  • 参与者
    持有一个
    上次读取
    时间戳,可用于计算消息是否已读取或未使用创建的消息
时间戳(->非常复杂的部分和毫秒很重要) pbly的其他一切都需要根据您的具体业务需求进行调整。这个场景是最灵活的,但是它需要大量的工作(基于个人经验),并且给您的架构增加了相当多的复杂性-我只建议在确实需要的情况下使用它

免责声明:
  • 这个可能是一个整体结构,我为示例所做的大多数设计决策都是基于假设的,我只能提到一些,或者文本可能太长,但请随意提问
  • 请原谅任何打字错误,我没有机会运行代码

您可以将receive_user更新为多对多字段,因为可能有多个用户接收到消息。receive_user也可以是用户模型的外键。我考虑了多个字段,因为如果这样做,每次管理员创建一条消息时,系统将为循环创建许多相同的内容消息,对吗?另一方面,您可能希望将
is_read
作为日期时间字段,而不是布尔字段。这样,您就可以跟踪消息的读取时间。您仍然可以围绕它编写布尔包装。只是一个想法。:-)快乐编码
def did_user_read_this_message(user, message)
    receiver = message.receive_users.get(receiver=user)
    return bool(receiver.is_read)