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的其他一切都需要根据您的具体业务需求进行调整。这个场景是最灵活的,但是它需要大量的工作(基于个人经验),并且给您的架构增加了相当多的复杂性-我只建议在确实需要的情况下使用它
免责声明:
- 这个可能是一个整体结构,我为示例所做的大多数设计决策都是基于假设的,我只能提到一些,或者文本可能太长,但请随意提问
- 请原谅任何打字错误,我没有机会运行代码
is_read
作为日期时间字段,而不是布尔字段。这样,您就可以跟踪消息的读取时间。您仍然可以围绕它编写布尔包装。只是一个想法。:-)快乐编码
def did_user_read_this_message(user, message)
receiver = message.receive_users.get(receiver=user)
return bool(receiver.is_read)