我的服务器在伦敦.
在我的settings.py身上:
TIME_ZONE = 'Europe/Moscow'
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时:
from django.utils import timezone
print timezone.now().hour
Run Code Online (Sandbox Code Playgroud)
它打印伦敦的时间.我做错了什么?
更新:
>> timezone.now()
datetime.datetime(2013, 4, 16, 12, 28, 52, 797923, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
tzinfo = <UTC>,也许它打印的不是伦敦时间,而是UTC的+0时间?无论如何,如何让django展示莫斯科时间?
另外,当我渲染模板时now = timezone.now().
{{ now.hour }} 打印,例如,12(伦敦时间)
{{ now|date:"G" }} 打印16(莫斯科时间)
我正在使用Django 1.7.1.我的模型看起来像这样:
from datetime import datetime
from django.db import models
class myModel(models.Model):
x = models.CharField(max_length=254,null=True, blank=True,)
Run Code Online (Sandbox Code Playgroud)
一切都很好.
但是,当我将以下属性添加到myModel时,它会中断:
y = models.DateTimeField(default=lambda: datetime.utcnow() + timedelta(days=1), editable=False)
Run Code Online (Sandbox Code Playgroud)
manage.py makemigrations 给我以下错误:
ValueError: Cannot serialize function: lambda
Run Code Online (Sandbox Code Playgroud)
这似乎是一个已知的错误:http://comments.gmane.org/gmane.comp.python.django.scm/125724
那么我该如何解决呢?y从创建模型的那一刻起,我需要将默认值自动设置为24小时.
我尝试使用以下代码在 django_admin 中预填充 TimeField:
from django.utils import timezone
time_start = models.TimeField('Heure de debut',max_length=20, default=timezone.now)
Run Code Online (Sandbox Code Playgroud)
我已经安装了pytz并正确设置
TIME_ZONE = 'Europe/Brussels'
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)
如果我点击它,管理员中的“现在”按钮会正确设置时间。但是,它最初以 UTC 显示时间(在我的情况下实际时间比实际时间早两个小时)
我错过了什么,有没有办法解决这个问题?我不想使用auto_now_add=False因为我希望以后能够改变这个时间......
我正在向现有数据库表添加一个新字段。它是用字符串自动生成的。
这是我的代码:
from django.utils.crypto import get_random_string
...
Model:
verification_token = models.CharField(max_length=60, null=False, blank=False, default=get_random_string)
Run Code Online (Sandbox Code Playgroud)
我使用生成迁移文件并./manage.py makemigrations生成一个文件。我验证新文件的默认设置为field=models.CharField(default=django.utils.crypto.get_random_string, max_length=60)
所以一切看起来都很好。
继续执行,./manage.py migrate终端不会出现任何错误。但是,当我检查表格时,我看到所有字段token都填充了相同的值。

这是我做错了什么吗?我如何在迁移中解决这个问题?
我需要做的是运行一个函数并在该函数返回的结果的开头附加一个前缀.每次为我的模型创建新实例时都需要执行此操作.
我试过的......
以下操作无效,因为您无法将字符串添加到函数中,并将ID设置为s_<function name etc>而不是函数的结果.
APP_PREFIX = "_s"
id = models.CharField(primary_key=True, max_length=50, unique=True,
default="{}{}".format(APP_PREFIX, make_id))
Run Code Online (Sandbox Code Playgroud)
也不会将前缀传递给函数,因为Django每次以这种方式调用函数时都会生成相同的键,不知道为什么:
id = models.CharField(primary_key=True, max_length=50, unique=True,
default=make_id(APP_PREFIX))
Run Code Online (Sandbox Code Playgroud)
这也不起作用:
id = models.CharField(primary_key=True, max_length=50, unique=True,
default=make_id + APP_PREFIX)
Run Code Online (Sandbox Code Playgroud)
或这个:
id = models.CharField(primary_key=True, max_length=50, unique=True,
default=make_id() + APP_PREFIX)
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?
我可以覆盖该save()方法并实现此目的,但必须有一种方法可以使用字段上的默认参数执行此操作!
在对此问题的评论中,我询问了如何使用默认值函数删除字段.总之,示例代码是:
def get_deadline():
return datetime.today() + timedelta(days=20)
class Bill(models.Model):
name = models.CharField(max_length=50)
customer = models.ForeignKey(User, related_name='bills')
date = models.DateField(default=datetime.today)
deadline = models.DateField(default=get_deadline)
Run Code Online (Sandbox Code Playgroud)
我对代码的问题是:
如何
deadline在删除get_deadline功能的同时再次删除该字段 ?我删除了一个带有默认值函数的字段,但是现在Django在删除函数后在启动时崩溃了.我可以手动编辑迁移,在这种情况下也可以,但如果您只是更改了默认功能,并想删除旧功能怎么办?
我最终删除了引用它的迁移的默认部分,但是如何很好地删除它?
我能想到的唯一方法是压缩迁移,这样使用该功能的迁移就会消失,但这并不总是一种选择.
我想根据创建日期在我的模型中自动创建一个过期日期。说60天?
class Something ( models.Model ):
created = models.DateTimeField ( auto_now_add = True )
expires = models.DateTimeField ( )
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最佳方法是什么?
谢谢!