我想创建一个显示锦标赛列表的网站。比赛可能每天多次进行。我举个例子:
比赛1:
我想避免两面派,所以我在日期和时间使用m2m:
class Day(models.Model):
name = models.CharField(max_length=10)
weekday = models.IntegerField()
def __unicode__(self):
return self.name
class Time(models.Model):
time = models.TimeField()
class Tournament(models.Model):
name = models.CharField("Tournament name", max_length=200)
currency = models.CharField(max_length=5, choices=CURRENCIES, default='USD')
prize = models.DecimalField(max_digits=20, decimal_places=2)
entry = models.DecimalField(max_digits=20, decimal_places=2, default=0)
fee = models.DecimalField(max_digits=20, decimal_places=2, default=0)
password = models.CharField("password", max_length=200, null=True, blank=True)
tournament_id = models.CharField("Tournament ID", max_length=50, null=True, blank=True)
number_of_players = models.DecimalField(max_digits=20, decimal_places=0, default='0', null=True, blank=True)
type = models.ManyToManyField('room.Type')
room = models.ManyToManyField('room.Room')
requirements_difficulty = models.IntegerField('Tournament Difficulty',validators=[MinValueValidator(1), MaxValueValidator(30)],null=True, blank=True)
requirements_text = models.CharField("Requirements Description", default='no requirements', max_length=1000,null=True, blank=True)
days = models.ManyToManyField(Day, related_name='days')
times = models.ManyToManyField(Time, related_name='times')
有更多参数,但重要的是只有最后两个。我创造了时间和日子,可以根据自己的意愿添加数小时和数天。
问题在于timezone。 TimeField不是时区感知的。我希望用户选择几天甚至几小时。以某种方式可以创建此功能时区吗?
我想我可以将它分别存储在db中,然后在views.py中创建时区感知日期时间对象正确吗?这里最好的方法是什么?
答案 0 :(得分:0)
如果您需要将天真的日期时间转换为可识别的数据时间,则可以替换其tzinfo
from datetime import datetime
import pytz
>>> _now = datetime.now() # naive datatime
>>> _now
datetime.datetime(2015, 9, 25, 17, 18, 56, 596488)
>>> _now = _now.replace(tzinfo=pytz.timezone('America/Chicago')) # aware datetime
>>> _now
datetime.datetime(2015, 9, 25, 17, 16, 36, 991419, tzinfo=<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>)
仅以'America/Chicago'
为例,您可以使用自己的时区。
如果你想在另一个日期时间显示一个有意识的日期时间:
>>> _now
datetime.datetime(2015, 9, 25, 17, 16, 36, 991419, tzinfo=<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD>)
>>> _now.astimezone(pytz.timezone('America/Lima'))
datetime.datetime(2015, 9, 25, 18, 7, 36, 991419, tzinfo=<DstTzInfo 'America/Lima' PET-1 day, 19:00:00 STD>)
最后一行将显示_now
,America/Chicago
时区,America/Lima
时间。