#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. Да, некоторые детали проекта немного изменялись. Я несколько раз возвращался к чертежной доске — в предыдущей структуре, возможно, было необходимо сделать это следующим образом. Теперь я думаю, что подход с одной моделью — это правильный путь.