Python 如何设置模型属性,在Django查询中切换布尔值?

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

在我下面的详细视图中,是否可以将模型中的布尔值设置为false? 我在django文档(queryset)中查找类似于
.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调用可能更为健壮。