Помогите создать модель для приложения Django - PullRequest
1 голос
/ 20 января 2010

Я пытаюсь создать приложение администрирования по уходу за детьми с Django, но у меня есть некоторые проблемы с кодом платежей.

Каждый ребенок должен платить ежемесячно 10 раз в год. Эти платежи имеют некоторые особенности:

  • Некоторые дети могут платить разные суммы в зависимости от экономического положения родителей.

  • Сумма платежей может измениться за год.

  • Платежи могут быть выплачены в разных вариантах.

  • Мастерские и продукты добавляются к общей стоимости платежа (они необязательны).

У меня проблема с моделированием этого приложения. Я думал о создании модели ребенка и модели оплаты:

class Kid(models.Model):
    food = models.BooleanField()
    workshop = models.BooleanField()
    special_price = models.DecimalField(blank=True)

class Payment(models.Model):
    kid = models.ForeignKey(Kid)
    date = models.DateField() 
    amount = models.DecimalField()`

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

Надеюсь, ты меня понял, спасибо. мкФ.

Ответы [ 2 ]

0 голосов
/ 21 января 2010

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

class Child(object):
   def __init__(self,income,paydate,meals=False,workshops=False):
      self.income = income
      self.paydate = paydate
      ...

У меня также будет модель правил ценообразования, которая в сочетании с дочерним объектом даст вам сумму платежа. Повторное обновление Правил ценообразования приведет к изменению платежа.

class PricingRules(object):
   def __init__(self,income_scale,paydate,meal_price,workshop_price,num_payments):
      ...

Я бы не использовал объект PricingRules для каждого дочернего элемента. Тогда будет Платежный объект

class Payment(object):
   def __init__(self,amount,date_paid):
      ...

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

0 голосов
/ 21 января 2010

Независимо от того, как будут выглядеть ваши окончательные модели, при условии, что вы сохраните модель оплаты, вы можете добавить к ней два поля:

    payment_date = model.DateField()
    already_paid = models.BooleanField()

Затем, чтобы получить просроченные платежи, вы сможете сделать запрос:

    Payment.objects.filter(payment_date__lte=datetime.date.today(), already_paid=False)

Имея эти объекты оплаты, вы сможете рассчитать точную сумму.

...