【问题标题】:how I can send sms to user when new record insert插入新记录时如何向用户发送短信
【发布时间】:2020-07-01 08:16:57
【问题描述】:

我有模型订单

class Order(models.Model):
STATUS = (
    ('Pending', 'Pending'),
    ('Out for delivery', 'Out for delivery'),
    ('Delivered', 'Delivered'),
)
shop = models.ForeignKey(Shop, models.CASCADE, null=True)
customer = models.ForeignKey(Customer, models.CASCADE, null=True)
product = models.ForeignKey(Product, models.CASCADE, null=True)
quantity = models.CharField(max_length=30, null=True, )
date_created = models.DateTimeField(auto_now_add=True, null=True)
status = models.CharField(max_length=200, null=True, choices=STATUS, default='Pending')
note = models.CharField(max_length=1000, null=True)

当客户插入订单时,我如何向商店发送短信,然后商店收到短信,您有新的客户姓名订单。数量中的product.name

客户模型

class Customer(models.Model):
      user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
      name = models.CharField(max_length=100, null=True, default='customer')
     Phone = models.CharField(null=True, max_length=10)

店铺型号

 class Shop(models.Model):
      user = models.OneToOneField(User, null=True, related_name='shop', blank=True, on_delete=models.CASCADE)
      name = models.CharField(max_length=70, null=True, default='shop', )
      address = models.CharField(max_length=200, null=True)
      Phone = models.CharField(null=True, max_length=10)

和我的订单views.py

def CreateOrder(request, shop_id, product_id):
    customer = request.user.customer
    shop = Shop.objects.get(id=shop_id)
    product = Product.objects.get(id=product_id)
    form = OrderForm()
    quantity = request.POST.get('quantity')
    note = request.POST.get('note')
    if request.method == 'POST':
        order = Order.objects.create(customer=customer, shop=shop,
                                   product=product, quantity=quantity, note=note)
        return redirect('CustomerOrder')

【问题讨论】:

  • 不要使用drf标签,如果你不使用它。我看到您提出的许多问题都遵循相同的模式。
  • 顺便说一句,我注意到您的所有问题都悬而未决。你见过What should I do when someone answers my question?吗?它有助于表明您的问题已得到解决。有可能你真的没有得到满意的答案;我只是想确保您知道此功能

标签: django django-rest-framework django-views django-haystack django-smart-selects


【解决方案1】:

你可以在 Django 中使用signals。本质上,当某些事件发生时,您的应用程序会收到通知。在您的情况下,您可以使用post_save,在调用模型的save() 方法后将触发信号。在 Django 文档中,您可以查看可用的不同类型 signals 的完整列表。

from .models import Order, Shop, Customer
from django.dispatch import Signal, receiver
from django.db.models.signals import post_save


@receiver(post_save, sender=Order)
def send_msg_to_shop_owners(sender, instance, **kwargs):
    # YOUR CODE HERE 
    pass
    

在receiver 中,您可以使用requests 将API 调用发送到您要使用的任何消息服务。

注意: 每当调用 Order 模型的 save() 方法时,post_save 信号将为 triggered。其中将包括 updating 您的模型。因此,根据您的用例,您甚至可以创建自己的custom signals。

Django 中的自定义信号

from django.dispatch import Signal, receiver

# DEFINE SIGNAL NAME WITH REQUIRED ARGUMENTS; FOR NOW JUST order_id, user_name
send_message_to_shop_owner = Signal(providing_args=["order_id","user_name"])

@receiver(send_message_to_shop_owner)
def send_message_to_shop_owner_receiver(sender, **kwargs):
    # access the parameters passed
    # order_id = kwargs["order_id"]
    # user_name = kwargs["user_name"]
    # REST OF YOUR CODE GOES HERE
    pass

现在您已经定义了您的signal,您需要在想要发送send 消息时触发它。在drf 中,我通常将其放在serializers.py 中,但您可以在views 中进行。 以下是触发信号的方式。

views.py

from .signals import send_message_to_shop_owner

def CreateOrder(request, shop_id, product_id):
    customer = request.user.customer
    shop = Shop.objects.get(id=shop_id)
    product = Product.objects.get(id=product_id)
    form = OrderForm()
    quantity = request.POST.get('quantity')
    note = request.POST.get('note')
    if request.method == 'POST':
        order = Order.objects.create(customer=customer, shop=shop,
                                   product=product, quantity=quantity, note=note)
        # Ignore my custom parameters, instead of that you can send yours
        send_message_to_shop_owner.send(Sender=Order, order_id=order_id,user_name=user_name)
        return redirect('CustomerOrder')

注意:对于custom signals,您需要随时触发它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多