gpt4 book ai didi

python - 增加数据库中的 IntegerField 计数器

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:28 24 4
gpt4 key购买 nike

作为 Django 的初学者,我尝试制作一个简单的应用程序,该应用程序可以提供内容被查看次数的 Http 响应。我创建了一个新的 Counter 模型,并在内部添加了 IntegerField 模型 count

class Counter(models.Model):
count = models.IntegerField(default=0)
def __int__(self):
return count

在 View 中,我从 Counter() 类中创建了一个变量 counter,并尝试将 +1 添加到 counter.count 整数,但是当我尝试保存时,它会给我一个错误,无法保存整数。

所以我尝试保存类:

def IndexView(response):
counter = Counter()
counter.count = counter.count + 1
counter.save()
return HttpResponse(counter.count)

此方法,会一直显示1,并且重新加载后无法更改。

<小时/>

我如何正确更改IntegerField模型,以便它可以在每次 View 后更新,并且即使服务器重新加载也会保存?

最佳答案

问题

是的,但是您正在为每个请求创建一个新的 Counter 对象,该对象从 0 重新开始,这就是您的问题

def IndexView(response):
counter = Counter() # This creates a new counter each time
counter.count = counter.count + 1
counter.save()
return HttpResponse(counter.count)

您上面所做的操作将导致数据库中出现一堆 count = 1 的 Counter 对象。

解决方案

下面的示例向您展示了如何获取现有的 Counter 对象,并递增它,或者使用 get_or_create() 创建它(如果它尚不存在)

首先我们需要将一个计数器关联到例如一个页面(或任何东西,但我们需要某种方式来识别它并从数据库中获取它)

class Counter(models.Model):
count = models.IntegerField(default=0)
page = models.IntegerField() # or any other way to identify
# what this counter belongs to

然后:

def IndexView(response):
# Get an existing page counter, or create one if not found (first page hit)
# Example below is for page 1

counter, created = Counter.objects.get_or_create(page=1)

counter.count = counter.count + 1
counter.save()
return HttpResponse(counter.count)

避免 count = count + 1 可能发生的竞争条件

为了避免竞争条件,请使用 F expression

# When you have many requests coming in,
# this may have outdated value of counter.count:
# counter.count = counter.count + 1

# Using an F expression makes the +1 happen on the database
from django.db.models import F
counter.count = F('count') + 1

关于python - 增加数据库中的 IntegerField 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com