【问题标题】:How to auto update data in django?如何在 django 中自动更新数据?
【发布时间】:2020-07-09 15:47:16
【问题描述】:

我正在尝试在 Django 中构建电子商务应用程序。在每个产品中,我都有三个标签标签,分别是 is_newis_hotis_promo

  1. is_new 将是 True 当产品将创建时,我已经做到了。但是当产品超过 7 天时,系统需要自动将 is_new 设为 False。我在 Product 模型中添加了 created_date 字段。如何将 is_new 自动更新为 False?有什么提示吗?

  2. is_hotTrue 当产品最畅销时。实际上前两个产品会很热。并且当其他产品热销时,之前的热销产品将自动False。怎么做?提示?

  3. is_promo 在我为产品添加折扣时将是True。当我取消折扣时,它将是 False。有什么提示吗?

【问题讨论】:

  • 您可以在views.py 本身中编写逻辑。如查询所有 7 天前的产品并将逻辑添加到您的 home_view。这样无论何时呈现主页,它都会进行所有预处理并给出适当的结果。
  • 另外,查看 @property 的 is_new 和 is_promo 属性。
  • 嘿,我做过同样的事情。但它仅在我重新启动服务器或保存代码库时才有效。然后它会自动更新视图。我认为 django 默认有缓存。我在主页 Listview 上尝试过通用视图。

标签: django django-models django-views django-channels django-signals


【解决方案1】:

如何实现这些取决于您如何处理相关数据。

  • is_new你需要创建日期。
  • is_hot 你需要相关的已售数量和一个值来比较它,比如 hot_threshold_count 什么的。
  • is_promo 您可能希望将此链接到促销详情。

这是我如何处理这个问题的粗略草图:

from django.utils import timezone
from django.conf import settings


class Product(models.Model):
    ...  # name, etc
    creation_datetime = models.Datetime(auto_add_now=True)
    sold_count = models.Integer(default=0)

    @property
    def is_hot(self) -> bool:
        return self.sold_count >= settings.HOT_COUNT_THRESHOLD

    @property
    def is_new(self) -> bool:
        elapsed_days = (timezone.now() - self.creation_datetime).days
        return elapsed_days <= settings.MAX_NEW_DAYS

    @property
    def is_promo(self) -> bool:
        has_promos = bool(Promotion.objects.filter(product=self).count())
        return has_promos



class Promotion(models.Model):
    creation_datetime = models.Datetime(auto_add_now=True)
    product = models.ForeignKey(Product)
    discount_percentage = models.Float()


地点: settings.MAX_NEW_DAYS 是一个 timedelta 对象

【讨论】:

  • 看完这篇,解决问题只需要几分钟。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-07-24
  • 2019-12-09
  • 1970-01-01
  • 2017-01-09
  • 2018-04-25
  • 2021-07-24
  • 2011-03-02
  • 2020-08-16
相关资源
最近更新 更多