Генерация моделей при создании одной модели (для приложения календаря) - PullRequest
0 голосов
/ 30 мая 2011

Я настроил несколько моделей, как вы вскоре увидите в моем коде. Это модели Era, Year, Month, Day и Hour.

Мне бы хотелось, чтобы, когда я создаю Эру, она создает набор лет, которые, в свою очередь, создают месяцы, которые, в свою очередь, создают дни, которые создают часы. Я уверен, что смогу понять большую часть этого, если бы кто-то мог просто помочь мне с методологией, скажем, с переходной эры в год.

Цель состоит в том, чтобы модель 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

Я уверен, что это довольно грязно ... Но в любом случае, пожалуйста, помогите мне разобраться в моем коде! И любую другую помощь, которую вы хотели бы мне оказать, я тоже ценю!

1 Ответ

1 голос
/ 30 мая 2011

Хранение структуры данных в 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 ваших моделей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...