首页 > 解决方案 > 如何设置模型属性,在 Django 查询中切换布尔值?

问题描述

是否可以在下面的详细视图中将模型中的布尔值设置为 false ?我查看了 django 文档(查询集),寻找类似的.set()方法,它似乎存在但不适用于这种特殊情况。如何通过我的视图切换我的unread布尔值?Models.py

另外,我在这里误解了什么,更好/合适的方法是什么?

模型.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) 

视图.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

标签: pythondjango

解决方案


您不是通过.set(..)调用来设置模型实例的字段,而是通过分配给属性(在幕后,Django 已经修补了__get__and__set__函数)。

因此,我们可以message通过从上下文中检索对象来获取对象(使用context['message_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

但是,我不知道在详细视图中将消息标记为已读是否是个好主意,这可能会导致代码重复,这通常不是一个好主意。


推荐阅读