django - 插入新记录时如何向用户发送短信
问题描述
我有模型订单
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)
当客户插入订单时,我如何向商店发送短信,然后商店收到短信,告知您有客户姓名的新订单。数量中的产品名称
客户模型
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')
解决方案
为此,您可以在 Django 中使用信号。本质上,当某些事件发生时,您的应用程序会收到通知。在您的情况下,您可以使用, 在调用模型的方法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
,您可以使用请求将 API 调用发送到您想要使用的任何消息服务。
注意: 只要调用模型的方法,就会post_save
发出信号。其中将包括您的模型。因此,根据您的用例,您甚至可以创建自己的.triggered
save()
Order
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
您需要在想要使用它时触发它。
推荐阅读
- javascript - Jquery 滑块循环
- ios - 使用用户 _www 或守护进程设置 macOS 钥匙串搜索列表
- c# - 将 Xaml 代码添加到项目时,不会加载 wpf 窗口
- excel - 复制范围重复偏移
- javascript - 使用javascript中的函数更改目标文本框的值
- python - 如何用离散数据重新采样 Pandas 中的数据?
- java - 登录后的新活动始终在视图中
- macos - Mac“配置:错误:C 编译器无法创建可执行文件”
- html - 如何使用 Puppeteer 在网站上单击没有任何类、id 等的按钮?
- mysql - Mysql LEFT JOIN with IS NULL 返回空结果