Я пытаюсь разработать систему типа аукциона, когда покупатель делает заказ, а затем разные магазины могут предлагать цену для этого заказа.
Интересной частью этой системы является то, что при первоначальном создании заказа у доступных магазинов будет 60 секунд, чтобы сделать соответствующее предложение. Когда первый магазин делает свое предложение, у «аукциона» теперь есть только следующие 20 секунд, чтобы другие магазины сделали свое собственное предложение. Если они все же сделают другое предложение за это меньшее выделенное время, то эти 20 секунд будут обновлены. Предложения могут поступать до тех пор, пока есть достаточно времени, которое не может превышать начальные предоставленные 60 секунд.
class Order(models.Model):
customer = models.ForeignKey(Customer)
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now_add=True)
total = models.FloatField(default=0)
status = models.IntegerField(default=0)
delivery_address = models.ForeignKey(DeliveryAddress)
store = models.ForeignKey(Store, null=True, blank=True, related_name='orders', on_delete=models.CASCADE)
credit_card = models.ForeignKey(CreditCard, null=True, blank=True, related_name='orders')
class OrderOffer(models.Model):
store = models.ForeignKey(Store, related_name="offers", on_delete=models.CASCADE)
order = models.ForeignKey(Order, related_name="offers", on_delete=models.CASCADE)
create_time = models.DateTimeField(auto_now_add=True)
Помимо этих требований, я также хочу обновлять клиента при поступлении новых предложений в режиме реального времени. Для этого я использую django-channels
реализацию WebSockets.
У меня есть следующий consumers.py
file:
from channels.generic.websockets import WebsocketConsumer
from threading import Timer
from api.models import Order, OrderOffer
from django.db.models.signals import post_save
from django.dispatch import receiver
class OrderConsumer(WebsocketConsumer):
def connect(self, message, **kwargs):
"""
Initialize objects here.
"""
order_id = int(kwargs['order_id'])
self.order = Order.objects.get(id=order_id)
self.timer = Timer(60, self.sendDone)
self.timer.start()
self.message.reply_channel.send({"accept": True})
def sendDone(self):
self.send(text="Done")
# How do I bind self to onOffer?
@receiver(post_save, sender=OrderOffer)
def onOffer(self, sender, **kwargs):
self.send(text="Offer received!")
if (len(self.offers) == 0):
self.offerTimer = Timer(20, self.sendDone)
self.offers = [kwargs['instance'],]
else:
self.offerTimer = Timer(20, self.sendDone)
self.offers.append(kwargs['instance'])
def receive(self, text=None, bytes=None, **kwargs):
# Echo
self.send(text=text, bytes=bytes)
def disconnect(self, message, **kwargs):
"""
Perform necessary disconnect operations.
"""
pass
Мне удалось установить канал связи WebSocket между моим клиентом и сервером. Я протестировал отправку сообщений, и все вроде нормально. Теперь я хочу обнаружить создание новых OrderOffer
и отправить уведомление клиенту. Для этого мне нужен доступ к переменной self
, чтобы использовать self.send
, что невозможно, так как декоратор сигналов не отправляет этот параметр. Я попытался заставить его объявить onOffer с помощью self, но получаю следующую ошибку:
TypeError: onOffer() missing 1 required positional argument: 'self'
Если бы я мог каким-то образом получить доступ к аргументам ключевого слова, которые устанавливают сигналы, я мог бы сделать что-то вроде: context = self
.
Буду признателен за любую помощь или даже альтернативные решения моей первоначальной проблемы.