> Den 28/07/2015 kl. 14.36 skrev Stefan Schindler <
st...@boxbox.org>:
>
>> This makes no sense to me. You want to delete an Item or Order but
>> then immediately create a new one?
>
> My actual goal is this: Whenever an Item object itself is deleted, I
> want to create a LogEntry object attached to the item's order. If an
> order is deleted however, I don't want to do anything.
>
> In code, I expected it to look something like this:
>
> @receiver(post_delete, sender=Item)
> def on_item_post_delete(instance, **kwargs):
> if instance.order is not None:
> LogEntry(order=instance.order).save()
>
> It's technically impossible (AFAIK) however to determine the case
> between "Item alone is deleted" and "Item is cascaded by Order
> deletion", at the moment.
Signals are nice, but sometimes they just make code more complicated. You could go for this (naive) approach:
class Order(models.Model):
def delete(self, *args, **kwargs):
# Detatch this order from its' items
for item in self.items.all():
item.order = None
item.save()
# Or is this what you really wanted?
# item.delete()
super().delete(*args, **kwargs)
class Item(models.Model):
def delete(self, *args, **kwargs):
if self.order:
LogEntry(order=instance.order).save()
super().delete(*args, **kwargs)
Erik