206👍
If you really want to use signals to achieve this, here’s briefly how,
from django.db.models.signals import post_save
from django.dispatch import receiver
class TransactionDetail(models.Model):
product = models.ForeignKey(Product)
# method for updating
@receiver(post_save, sender=TransactionDetail, dispatch_uid="update_stock_count")
def update_stock(sender, instance, **kwargs):
instance.product.stock -= instance.amount
instance.product.save()
22👍
Personally I would override the TransactionDetail’s save() method and in there save the new TransactionDetail and then run
self.product.stock -= self.amount
self.product.save()
- [Django]-Should I be adding the Django migration files in the .gitignore file?
- [Django]-Duplicate column name
- [Django]-Render HTML to PDF in Django site
19👍
If you want to avoid getting maximum recursion depth exceeded
, then you should disconnect signals, before saving within the signal handler. The example above (Kenny Shen’s answer), would then be:
from django.db.models.signals import post_save
from django.dispatch import receiver
class TransactionDetail(models.Model):
# ... fields here
# method for updating
@receiver(post_save, sender=TransactionDetail, dispatch_uid="update_stock_count")
def update_stock(sender, instance, **kwargs):
instance.product.stock -= instance.amount
post_save.disconnect(update_stock, sender=TransactionDetail)
instance.product.save()
post_save.connect(update_stock, sender=TransactionDetail)
This is described thoroughly in Disconnect signals for models and reconnect in django, with a more abstract and useful example.
Also see: https://docs.djangoproject.com/en/2.0/topics/signals/#disconnecting-signals in the django docs.
- [Django]-How to iterate through dictionary in a dictionary in django template?
- [Django]-FileUploadParser doesn't get the file name
- [Django]-How can I call a custom Django manage.py command directly from a test driver?
6👍
If you really want to use signals in django please try this:
#import inbuilt user model
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_profile(sender, **kwargs):
# write you functionality
pass
then add default_app_config
in the init file
default_app_config = "give your AppConfig path"
- [Django]-Python + Django page redirect
- [Django]-How can one use enums as a choice field in a Django model?
- [Django]-Embed YouTube video – Refused to display in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'
3👍
In fact, the docstring explains the Signals
is in django.dispatch.Signal.connect
:
def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
Connect receiver to sender for signal.
Arguments:
receiver
A function or an instance method which is to receive signals.
Receivers must be hashable objects.
If weak is True, then receiver must be weak referenceable.
Receivers must be able to accept keyword arguments.
If a receiver is connected with a dispatch_uid argument, it
will not be added if another receiver was already connected
with that dispatch_uid.
sender
The sender to which the receiver should respond. Must either be
a Python object, or None to receive events from any sender.
weak
Whether to use weak references to the receiver. By default, the
module will attempt to use weak references to the receiver
objects. If this parameter is false, then strong references will
be used.
dispatch_uid
An identifier used to uniquely identify a particular instance of
a receiver. This will usually be a string, though it may be
anything hashable.
- [Django]-How to add custom field in ModelSerializer?
- [Django]-How can I disable logging while running unit tests in Python Django?
- [Django]-Foreign key from one app into another in Django