为了在Heroku的免费计划下继续使用Django,删除日志来节省PostgreSQL的行数

Django的日志对Heroku的免费套餐限制造成挤压。

我在Heroku上使用Django搭建了一个Web应用程序,用于可视化测量得到的温度和湿度数据。但不知何时,我突然遇到了免费套餐的数据容量限制(最多10,000行),导致无法访问。
尽管我考虑了容量限制,并尽量确保POST的数据总数少于7000条,但为什么还是超过了呢?于是我检查了一下PostgreSQL的内容,发现了名为”django_admin_log”的表,行数已经超过了4000行。
我之前没注意到,django_admin_log是保存管理页面操作历史的表。
总之,我必须避免容量限制,所以决定删除django_admin_log。
虽然有很多方法可以选择,但我暂时尝试了以下两种方法。

    • PostgreSQLをHeroku経由で直接操作する

 

    Djangoアプリ内からpythonプログラムで削除する

通过Heroku直接操作PostgreSQL

因为有位用户已经解决了完全相同的问题,我参考了他的方法来删除占用Heroku上PostgreSQL行数的django_admin_log。

在Django应用内使用Python程序进行删除。

由于我想定期自动删除,所以我考虑了从Django应用程序中删除的方法。可能还有更好的方法,但请原谅我是个业余者。

用日期和时间来指定的方法

由于LogEntry中有一个名为”action_time”的时间列,因此可以通过对其进行筛选来在指定时间删除。

from django.contrib.admin.models import LogEntry
from django.utils import timezone
import pytz

threshold_date = timezone.now()
LogEntry.objects.filter(action_time__lte=threshold_date).delete()

根据数量指定的方法

检查django_admin_log数量,如果超过指定数量,则删除。

from django.contrib.admin.models import LogEntry

def DeleteLogsMoreThanLimit(number):
    count = LogEntry.objects.count()
    if count > number:
        models = LogEntry.objects.order_by('-action_time')[:number] 
        LogEntry.objects.exclude(pk__in=models).delete()

DeleteLogsMoreThanLimit(10)

在Django的管理界面上显示日志。

如果想在管理页面上显示日志,可能会是这样的感觉吧。只需要在admin.py中添加以下代码即可。
但是,即使从管理页面上删除日志,也会添加“删除操作日志”,所以不能减少日志的总数,我认为。
只能确认日志的内容而已呢…

from django.contrib.admin.models import LogEntry

class LogAdmin(admin.ModelAdmin):
    list_display = ('action_time', 'user', 'content_type')
    list_filter = ['action_time', 'user', 'content_type']
    ordering = ('-action_time',)

admin.site.register(LogEntry, LogAdmin)

我借鉴了您的意见

    • 各テーブルのRow数確認

 

    • heroku上のPostgresqlの操作

 

    herokuのPostgresql row数を圧迫するdjango_admin_logを削除
广告
将在 10 秒后关闭
bannerAds