Django:正在更新request.user实例

时间:2017-09-17 20:27:39

标签: python django

这是我的模特

class Extra(models.Model):
    user = models.ForeignKey(User)
    timestamp = models.DateTimeField(null=True, blank=True)

我的观点类似于

def notifications(request):
    new = Extra.objects.filter(user=request.user)
    if new:
        Extra.objects.update(timestamp=timezone.now())
    else:
        Extra.objects.create(user=request.user, timestamp=timezone.now())

我试图在用户请求特定页面时保存日期时间。

正如您可以看到有关用户的数据是否已存在于数据库中,然后我在用户请求页面时更新它,否则我将为该用户创建新实例。

但这不是一个好方法,因为它更新整个数据库,而不仅仅是与request.user相关的特定实例,我们可以在视图中看到(我猜第四行)。

那么,我怎样才能使用变量' new'因为它已经保存了数据(如果存在)&只更新数据库中的request.user实例?

请帮助我们使用此代码。在此先感谢:)

2 个答案:

答案 0 :(得分:0)

只需在已过滤的QuerySet上调用''' print all the possible trees ''' class Tree(): '''each node is a dict of Nodes, because there can be multiple parses''' def __init__(self, root=None): self.root = self.build(root) self.printTrees(root) def build(self, p): # p is a dict as in A = {0: ('a', B, C, False), 'terminal':False} if p['terminal']: # if terminal node = {} for key in p.keys(): if key != 'terminal': node[key] = Node(p[key][0], None, None, True) return node node = {} for key in p.keys(): if key != 'terminal': node[key] = Node(p[key][0], # type self.build(p[key][1]), # left self.build(p[key][2])) # right return node def printTrees(self, p): '''TODO complete print one tree and then go to another tree!''' if p['terminal']: # if terminal for key in p.keys(): if key != 'terminal': print(p[key][0], end=' ') return for key in p.keys(): if key != 'terminal': print(p[key][0]) self.printTrees(p[key][1]) # left self.printTrees(p[key][2]) # right class Node(): def __init__(self, typ=None, left=None, right=None, terminal=False): self.type = typ self.left = left self.right = right self.terminal = terminal def __str__(self): return "Node: "+self.type def main(): X = {0: ('x', None, None), 'terminal':True} Y = {0: ('y', None, None), 'terminal':True} G = {0: ('g', None, None), 'terminal':True} F = {0: ('f', None, None), 'terminal':True} D = {0: ('d', None, None), 'terminal':True} C = {0: ('c', None, None), 'terminal':True} E = {0: ('e', F, G, False), 'terminal':False} B = {0: ('b', D, E, False), 1: ('b', X, Y, False), 'terminal':False} A = {0: ('a', B, C, False), 'terminal':False} t = Tree(A) if __name__ == '__main__': main() 即可。你几乎就在那里:)

update()

Django Docs中也有类似的例子。

答案 1 :(得分:0)

我不确定这是否能解决您的问题但也许这可能会帮助您达到您想要的目标。 在我的应用程序中,我要么插入带有“已创建”时间戳的记录,要么使用“已更新”时间戳更新现有记录,具体取决于记录是否已存在。如果我正确地理解你的问题那么它就不完全相同了,但我认为这足以让你有所帮助。

所以我做的是在我的班级中覆盖标准的保存方法。因为我对所有表中的所有记录执行此操作,所以我在基类中完成了此操作,但您可以轻松地在所需的类上执行此操作。

看着你的课,我会添加如下内容:

class Extra(models.Model):
       user = models.ForeignKey(User)
       timestamp = models.DateTimeField(null=True, blank=True)

       def save(self, *args, **kwargs):
           ''' Check to see if the record exists '''
           if not self.id:
           ''' If there is no id on the record it must be new so set the insert data '''
               self.user = request.user
               self.timestamp = timestamp.now()
           else:
               ''' If there is an id just update the timestamp '''
               self.timestamp = timestamp.now()
           return super(Extra, self).save(*args, **kwargs)

基本上这样做是拦截对数据库的保存调用,检查记录是否是新的,处理你需要处理的内容,然后使用return语句将路径发送到数据库。

正如我所说,它可能无法解决您的问题,但希望它会有所帮助。

祝你好运。