如何设置一个字段
is_read = models.IntegerField(choices=message_status, default=SENT)
message = models.CharField(max_length=1200)
sent_time = models.DateTimeField(auto_now_add=True)
read_time = models.DateTimeField()
这里的read_time
应该是is_read
变为1的时间
最佳答案
现在您的模型存在数据重复。事实上,is_read
可能是 0
,但 read_time
已设置。您可以尝试定义 View 来防止这种情况发生,但这将具有挑战性:每个 View 都需要仔细编写以确保这一点。此外,您可以在 Django 之外操作数据库。
将 read_time
设置为空可能会更好:
from django.utils.timezone import now
class Message(models.Model):
message = models.CharField(max_length=1200)
sent_time = models.DateTimeField(auto_now_add=True)
read_time = models.DateTimeField(<b>null=True</b>)
@property
def is_read(self):
return <b>self.read_time is not None</b>
@is_read.setter
def is_read(self, read):
if self.read != self.is_read:
if read:
self.mark_read()
else:
self.mark_unread()
def mark_read(self, save=True):
self.read_time = now()
if save:
self.save()
def mark_unread(self, save=True):
self.read_time = None
if save:
self.save()
因此,如果您将消息标记为已读,则将 read_time
保存到当前时间戳。此外,我们定义了一个属性 .is_read
,如果 read_time
不是 None
,则该属性为 True
。您还可以设置 some_message.is_read = True
将 read_time
更新为现在,并使用 some_message.is_read = False
设置 read_time
返回到 None
。
关于python - 在 Django-rest-framework 中创建具有关系的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57654537/