1.auto_now=True 更新规则

django的orm关于更新数据库的方法有update和save两种方法。
前提在模型中设置了auto_now=True时间戳属性,为了方便数据库自动更新时间,而使用update更新的记录,数据库中并没有自动更新,达到我的需求。

auto_now=True自动更新,有一个条件,就是要通过django的model层。

如create或是save方法。

如果是filter之后update方法,则直接调用的是sql,不会通过model层,所以不会自动更新此时间。所以使用save方法更新才能达到我的需求。

例如

我定义数据库

updated = models.DateTimeField(auto_now=True)

这个save()每次访问时候total_views+1会自动更新时间

article.total_views += 1
article.save()

后来改成了,为什么加article = Article.objects.get(id=id), 因为更新后进入文章详情并没有看到total_views+1,刷新才看到,最易再查询一次数据库,但是增加了一次查询,等以后学多了说不定可以有效解决这个问题

Article.objects.filter(id=id).update(id=id, total_views=article.total_views + 1)
article = Article.objects.get(id=id)

2.获取ip

from django.conf import settings
from django.core.mail import send_mail
def get_user_ip(request):
    """获取用户ip,有可能服务器会500"""
    if 'HTTP_X_FORWARDED_FOR' in request.META:  # 获取 ip
        client_ip = request.META['HTTP_X_FORWARDED_FOR']
        client_ip = client_ip.split(",")[0]  # 所以这里是真实的 ip
        flag = "真实ip"
    else:
        client_ip = request.META['REMOTE_ADDR']  # 这里获得代理 ip
        flag = "代理ip"
    text = flag + ":ip:"+client_ip
    send_mail('主题', text, settings.EMAIL_HOST_USER, ["534640040@qq.com"])
    # 👆获取ip地址