Генерация моделей, когда я создаю одну модель (для приложения календаря)

#django #django-models #model #calendar

#django #django-модели #Модель #Календарь

Вопрос:

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

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

Таким образом, цель состоит в том, чтобы модель 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. Вы хотите, чтобы при создании Era создавались строки за 9999 лет, , строки за 9999 * 12 месяцев, ~9999*12*30 строки дней, ~9999*12*30*24 часовые ряды, верно? Вы уверены, что хотите сохранить все это в DB?

2. Я думаю, что @DrTyrsa пытается сказать, что вы не хотите хранить это в своей базе данных. Как часто вы ожидаете, что эта операция будет выполняться?

3. Мне бы очень хотелось, чтобы это происходило очень редко. Я не остановился на 9999 в качестве окончательного числа (скорее всего, это будет число, близкое к 500). Кроме того, теперь, когда вы упомянули об этом, я думаю, мне придется переопределить метод delete () для всех этих, чтобы он рекурсивно очищал все младшие модели.

4. Но помимо сохранения ее в моей базе данных, я действительно не уверен, какие варианты у меня были бы…

5. @RHH Почему бы не использовать DateTimeField ?

Ответ №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 метод ваших моделей.

Комментарии:

1. Конечно. Но я не знаю, чего вы пытаетесь достичь. Поэтому давать советы сложно 😉

2. Да, некоторые детали проекта немного изменялись. Я несколько раз возвращался к чертежной доске — в предыдущей структуре, возможно, было необходимо сделать это следующим образом. Теперь я думаю, что подход с одной моделью — это правильный путь.