满足某些条件时执行功能

时间:2020-11-07 20:42:06

标签: python django django-rest-framework

我的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)个“ Torrential或Intense”条目时。它必须自动执行send_sms,但返回错误:

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

我在这里想念什么?请帮忙。谢谢!

2 个答案:

答案 0 :(得分:0)

您的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)

答案 1 :(得分:0)

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的自动化?谢谢