【问题标题】:Execute a function when certain conditions are met满足特定条件时执行函数
【发布时间】:2020-11-07 20:42:06
【问题描述】:

我的 django 应用程序有一个功能是send_sms,我还想要一个自动短信auto_sms 功能。当我的数据模型满足条件时。

@views.py

def send_sms(request):
    z = Rainfall.objects.latest('timestamp')
    numbers = Mobile.objects.all()
    message = ('Test Message')

    account_sid = '**************'
    auth_token = '**************'

    client = Client(account_sid, auth_token)
    for i in numbers:
        client.messages.create(to=i.mobile_number,
                               from_='**************',
                               body=message)


    return HttpResponseRedirect('/success/', 200)


def auto_sms(request):
    responses = Rainfall.objects.filter(
        level='Torrential' or 'Intense',
        timestamp__gt=now() - timedelta(days=1),
        sms_sent=False,
    )
    if responses.count() >= 10:
        send_sms(request)
        responses.update(sms_sent=True) 

@models.py

class Rainfall(models.Model):
    level = models.CharField(max_length=10, blank=True, default='')
    amount = models.FloatField()
    timestamp = models.DateTimeField(auto_now_add=True)

现在我正在测试它,当auto_sms 在一天内检测到数据库中有多个(10)个“激流或强烈”条目时。它必须自动执行send_sms,但它会返回错误:

Cannot resolve keyword 'sms_sent' into field. Choices are: amount, id, level, timestamp

我在这里错过了什么?请帮忙。谢谢!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您的 Rainfall 类中没有名为 sms_sent 的字段 - 考​​虑添加该字段或更改您的查询:

    class Rainfall(models.Model):
        ...
        sms_sent = models.BooleanField(default=False) # add this field
    
        # override save method:
        def save(self, *args, **kwargs):
    
            if <some conditions are met>:
    
                 # send sms:
                 self.send_sms()
                 self.sms_sent = True
    
            super(Rainfall, self).save(*args, **kwargs)
    

    【讨论】:

    • 顺便说一句,我有另一个记录短信日志的模型,我可以用它来代替吗?
    • 您好,我上面有更新的代码。我删除了sent_sms。它实际上有效,但仅适用于手动执行。我现在的问题是如何使其自动化。哈哈
    【解决方案2】:

    UPDATE

    你好,

    我的降雨模型实际上是这样的。抱歉,我现在就详细说明。

    @models.py

    class Rainfall(models.Model):
        level = models.CharField(max_length=10, blank=True, default='')
        amount = models.FloatField()
        timestamp = models.DateTimeField(auto_now_add=True)
    
        def update_level(self):
            if 0.1 <= self.amount < 2.5:
                return 'Light'
            elif 2.5 <= self.amount < 7.5:
                return 'Moderate'
            elif 7.5 < self.amount < 15:
                return 'Heavy'
            elif 15 <= self.amount < 30:
                return 'Intense'
            elif 30 <= self.amount < 50:
                return 'Torrential'
    
        def save(self, *args, **kwargs):
            if not self.level:
                self.level = self.update_level()
            super().save(*args, **kwargs)
    
    
    class Sms(models.Model):
        description = models.CharField(max_length=100, blank=True)
        timestamp = models.DateTimeField(auto_now_add=True)
    

    我的views.py看起来像这样。

    def send_sms(request):
        z = Rainfall.objects.latest('timestamp')
        numbers = Mobile.objects.all()
        message = (f'Test ({z.timestamp})')
    
        account_sid = '*******'
        auth_token = '********'
    
        client = Client(account_sid, auth_token)
        for i in numbers:
            client.messages.create(to=i.mobile_number,
                                   from_='********',
                                   body=message)
    
        record = Sms.objects.create(description=f'{message}')
        record.save()
    
        return HttpResponseRedirect('/api/', 200)
    
    
    
    def auto_sms(request):
        responses = Rainfall.objects.filter(
            level='Torrential' or 'Intense',
            timestamp__gt=now() - timedelta(days=1),
        )
        if responses.count() >= 5:
            send_sms(request)
    
        return HttpResponse(200)
    
    
    

    现在我不能在我的降雨量上添加另一个字段,我可以改用 SMS 模型吗?对于auto_sms 的自动化?谢谢

    【讨论】:

    • 查看我的更新答案。您有几个选项,发布保存信号,覆盖保存方法等。在我的回答中,我提供了一个带有一些 sudo 代码的覆盖保存方法。
    • 您好,谢谢!我为最新代码添加了另一条评论。你能检查一下吗?谢谢!抱歉之前的解释混乱。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多