【问题标题】:Generating models when I create one model (for a calendar app)创建一个模型时生成模型(用于日历应用程序)
【发布时间】:2011-09-04 18:23:25
【问题描述】:

我已经设置了几个模型,您很快就会在我的代码中看到。这些模型是时代、年、月、日和小时。

我想,当我创建一个时代时,它会创建一组年份,然后创建月份,然后创建日期,然后创建小时。我敢肯定,如果有人可以帮助我使用从时代到年份步骤的方法,我可以解决大部分问题。

目标是让 CurrentTime 模型能够逐步遍历所有其他模型(基本上就像一个时钟)。

如果您想知道,我将尝试制作一个简单的基于网络的游戏,这就是为什么这些值与常规日历有点不同!

这是我的 models.py 文件:

from django.db import models

# Create your models here.
DAY_LENGTH = 24 #1 day is 24 hours
MONTH_LENGTH = 24 #1 month is 24 days
MONTH_CHOICES = (
        (1, 'January'),
        (2, 'Febuary'),
        (3, 'March'),
        (4, 'April'),
        (5, 'May'),
        (6, 'June'),
        (7, 'July'),
        (8, 'August'),
        (9, 'September'),
        (10, 'October'),
        (11, 'November'),
        (12, 'December'),
        (13, 'Extravember'),
        (14, 'Othertober'),
    )
DAY_CHOICES = (
        (1, 'Monday'),
        (2, 'Tuesday'),
        (3, 'Wednesday'),
        (4, 'Thursday'),
        (5, 'Friday'),
        (6, 'Saturday'),
    )
YEAR_LENGTH = MONTH_CHOICES.length     #1 year contains
ERA_LENGTH = 9999 #1 era is 9999 years     #one of every month

NUMBER_OF_BLOCKS = 6 #Number of discreet actions programmable for a day
BLOCK_LENGTH = DAY_LENGTH / NUMBER_OF_BLOCKS

class Era(models.Model):
    #Era number
    value = models.AutoField()
    #Name of the Era
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return "Era of " + self.name

class Year(models.Model):
    #Year number
    value = models.PositiveSmallIntegerField(max_value=9999)
    #Era the year belongs to
    era = models.ForeignKey('Era')
    length = YEAR_LENGTH

    def __unicode__(self):
        return "Year " + self.value + self.era


class Month(models.Model):
    #Should return name of month
    value = models.PositiveSmallIntegerField(
        choices=MONTH_CHOICES)
    #Year that the month fits into
    year = models.ForeignKey(Year)

    def __unicode__(self):
        return self.value " of " + self.year

class Day(models.Model):
    #Should give the name of the day
    name = models.PositiveSmallIntegerField(
        choices = DAY_CHOICES)
    #Month that the day belongs to
    month = models.ForeignKey('Month')
    #Day number, dependant on month length
    value = models.PositiveSmallIntegerField(
        max_value = month.length)

    def __unicode__(self):
        return self.name + ", day " + self.value + " of " + self.month

class Hour(models.Model):
    value = models.PositiveSmallIntegerField(
        max_value = DAY_LENGTH)
    day = models.ForeignKey('Day')

    def __unicode__(self):
        return self.value + ":00, " + self.day

class CurrentTime(models.Model):
    hour = ForeignKey('Hour')
    day = ForeignKey('Day')
    month = ForeignKey('Month')
    year = ForeignKey('Year')
    era = ForeignKey('Era')

    def __unicode__(self): #!!will only work for current config!
        return self.hour

我敢肯定这很混乱......但无论如何,请帮我弄清楚我的代码!以及您想给我的任何其他帮助,我也很感激!

【问题讨论】:

  • 你想,当你创建Era,创建9999年行,9999*12月行,~9999*12*30天行,~9999*12*30*24小时行,正确的?您确定要将所有这些都存储在 DB 中吗?
  • 我认为@DrTyrsa 想说的是您不想将其存储在数据库中。您预计此操作多久发生一次?
  • 我真的希望它很少发生。我还没有确定 9999 作为一个确定的数字(它很可能是一个接近 500 的数字)。同样,既然您提到了它,我想我将不得不为所有这些重新定义 delete() 方法,以便它递归地清除所有较低的模型。
  • 但是除了将它存储在我的数据库中之外,我真的不确定我会有什么样的选择......
  • @RHH 为什么不使用DateTimeField

标签: django django-models model calendar


【解决方案1】:

在 6 个表中存储一个数据结构是多余的。您不会将字符串“abc”存储在三个不同的表中。所以在我看来,你的设计中有些地方是错误的。

尝试尽可能简单地编写您的问题,并将其与您的解决方案一起发布到 SO。

您的实现肯定有替代方案,import this

>>> import this
...
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
...

如果您想 - 反对任何建议 ;-) - 使用上述模型,请覆盖模型的 save 方法。

【讨论】:

  • 当然。但我不知道你想要达到什么目的。所以给出建议很困难;-)
  • 是的,该项目的一些细节一直在变化。我已经多次将其带回绘图板 - 在以前的结构中,可能有必要这样做。现在我认为唯一的模型方法是要走的路。
猜你喜欢
  • 2011-12-22
  • 2015-06-17
  • 1970-01-01
  • 2023-03-20
  • 2015-07-21
  • 1970-01-01
  • 2012-10-13
  • 2019-05-17
  • 2021-10-10
相关资源
最近更新 更多