Python 如何设置模型属性,在Django查询中切换布尔值?
在我下面的详细视图中,是否可以将模型中的布尔值设置为false? 我在django文档(queryset)中查找类似于Python 如何设置模型属性,在Django查询中切换布尔值?,python,django,Python,Django,在我下面的详细视图中,是否可以将模型中的布尔值设置为false? 我在django文档(queryset)中查找类似于.set()的方法。对于这种情况,它似乎存在,但不适用于这种特殊情况。 如何通过我的视图在我的Models.py中切换未读布尔值 另外,我在这里误解了什么?更好/合适的方法是什么 Models.py: class Message(models.Model): recipient = models.ForeignKey(CustomUser, on_delete = mod
.set()
的方法。对于这种情况,它似乎存在,但不适用于这种特殊情况。
如何通过我的视图在我的Models.py
中切换未读
布尔值
另外,我在这里误解了什么?更好/合适的方法是什么
Models.py:
class Message(models.Model):
recipient = models.ForeignKey(CustomUser, on_delete = models.CASCADE,related_name = 'recipient',null = True)
sender = models.ManyToManyField(CustomUser,related_name = 'messages')
date = models.DateTimeField(auto_now_add=True, blank=True)
subject = models.CharField(max_length = 1000, blank = True)
message = models.TextField(blank=True, null=True)
unread = models.BooleanField(default = True)
Views.py:
### Message detail class
class MessageInboxDetail(DetailView):
'''
This view lets the user view the details of a message created
'''
context_object_name = 'message_detail'
model = Message
template_name = "myInbox/message_detail.html"
def get_context_data(self, **kwargs):
context = super(MessageInboxDetail, self).get_context_data(**kwargs)
context.update({
'message_detail': Message.unread.set(False) }) # Message(unread=True/False)
return context
您不需要使用
.set(..)
调用来设置模型实例的字段,而是通过指定属性(在窗帘后面,Django修补了\uuuuuuu get\uuuuu
和\uuu set\uuuuu
函数)
因此,我们可以通过从上下文中检索message
对象(使用上下文['message\u detail']]
),然后更改其状态,最后将更新的版本保存到数据库中。例如:
class MessageInboxDetail(DetailView):
'''
This view lets the user view the details of a message created
'''
context_object_name = 'message_detail'
model = Message
template_name = "myInbox/message_detail.html"
def get_context_data(self, **kwargs):
context = super(MessageInboxDetail, self).get_context_data(**kwargs)
message = context['message_detail']
message.unread = False
message.save()
return context
class MessageInboxDetail(DetailView):
'''
此视图允许用户查看所创建邮件的详细信息
'''
上下文\对象\名称='消息\详细信息'
模型=消息
template\u name=“myInbox/message\u detail.html”
def获取上下文数据(自身,**kwargs):
context=super(MessageInboxDetail,self)。获取上下文数据(**kwargs)
消息=上下文['message_detail']
message.unread=False
message.save()
返回上下文
但是,我不知道在详细视图中将消息标记为已读是否是一个好主意,它可能会导致代码重复,这通常不是一个好主意。
context['instance'].unread=False
和context['instance'].save()
@WillemVanOnsem我收到一个警告:“BooleanField的实例没有set成员”然后,我得到一个“instance”的KeyError。“但是,我不知道在详细信息视图中将消息标记为已读是否是一个好主意,这可能会导致代码重复,这通常不是一个好主意。”您能进一步解释一下吗?在django中是否有更好/更简单的方法来实现此功能?@timi95:最好在Message
类本身中实现mark\u read
函数。此外,如果视图失败(例如,用户的网络连接停止工作),可能会发生这种情况,则该消息被标记为已读,而用户实际上并未阅读该消息。如果要防止这种情况发生,则对将消息标记为已读的视图的AJAX调用可能更为健壮。