基于约束的自定义外键值

时间:2018-08-07 05:19:51

标签: django database algorithm django-models foreign-keys

我的模型如下:

PRODUCT_EXPIRY模型:

product_id = model.IntegerField()
expires_in = model.IntegerField() --days count

另一个模型为:

产品:

product_id = model.IntegerField()
expires_in = model.IntegeField(blank=True)  --days count
name = model.CharField()
price = model.FloatField()
...other fields

我想要的是,让商店添加产品,这里expires_in(天数)的产品是可选的,他可以选择在添加产品时手动添加产品,如果没有添加,则到期是从product_expire模型输入的,通过product_id进行映射。

但是考虑以下情况:

  1. 牛奶X的有效期为3天。
  2. 牛奶Y的有效期为60天。
  3. 可可粉的有效期为6个月。

当商店输入产品时,假设他至少从生产日期起10天后得到了产品。因此,添加可可粉的expire_in应该是60-10 = 50 days,即产品的有效期超过30天。在牛奶车每天交付牛奶的地方,有效期少于30天的产品将具有相同的有效期,而不会发生任何变化,即,为牛奶X添加牛奶expires_in将是3 days。我该怎么办? Product模型expired_in是否必须是外键?

例如:假设我们知道可乐会在1个月后到期,那么如果商店忘记输入有效期,则自动添加的有效期应为20天。因此,稍后我可以通知商店产品是否即将过期。但是,对于牛奶,添加的有效期将保持不变。
还是我必须通过重写产品模型的保存功能为此构建自定义算法?

我现在在想的是:

  • 将其保留为IntegerField,并添加另一个字段为DateTime, 如果输入了日期时间字段,则使用该字段,否则使用expired_in 字段,并覆盖保存功能。
  • 稍后通过熊猫或某些自定义python脚本处理空白值。 但是有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

我所看到的模型应该像

class Product(models.Model):
    """
    """
    class Meta:
        verbose_name = _("Procuct")
        verbose_name_plural = _("Products")
    quantity = model.IntegeField() #Imagine ther are 50 packs of coffe that have arrived today
    name = models.CharField(max_length=255, verbose_name=_("name"))
    prise = FloatField()
    expiry_date = models.DateField()
    arrived_at = models.DateField()
    status = 'not_expired'


    def __str__(self):
        return '{name} {expiry_date}'.format(name=self.name, expiry_date=self.expiry_date)

最好使用到期日期而不是exprites_in,因为如果员工应该键入allthin,则将花费更多的时间,而不仅仅是输入到期日期

然后,如果您要检查即将在接下来的5天内到期的产品

导入日期

def checkExpiringProducts(days)
    return Products.objects.filter(status='not_expired',expiry_date__lte=date.today()+datetime.timedelta(days=days)

如果您致电

checkExpiringProducts(5)#gives you the products that are expiring next 5 days

您应该放status,然后每天检查是否有某产品今天或明天要使用expiry_date