Ho un paio di livelli modello di ereditarietà in Django:Come utilizzare l'ereditarietà del modello di Django con i segnali?
class WorkAttachment(models.Model):
""" Abstract class that holds all fields that are required in each attachment """
work = models.ForeignKey(Work)
added = models.DateTimeField(default=datetime.datetime.now)
views = models.IntegerField(default=0)
class Meta:
abstract = True
class WorkAttachmentFileBased(WorkAttachment):
""" Another base class, but for file based attachments """
description = models.CharField(max_length=500, blank=True)
size = models.IntegerField(verbose_name=_('size in bytes'))
class Meta:
abstract = True
class WorkAttachmentPicture(WorkAttachmentFileBased):
""" Picture attached to work """
image = models.ImageField(upload_to='works/images', width_field='width', height_field='height')
width = models.IntegerField()
height = models.IntegerField()
Ci sono molti modelli differenti ereditati da WorkAttachmentFileBased
e WorkAttachment
. Voglio creare un segnale, che aggiornerebbe un campo attachment_count
per il lavoro principale, quando viene creato l'allegato. Sarebbe logico pensare che il segnale creato per il mittente genitore (WorkAttachment
) verrebbe eseguito anche per tutti i modelli ereditati, ma non lo è. ci
@receiver(post_save, sender=WorkAttachment, dispatch_uid="att_post_save")
def update_attachment_count_on_save(sender, instance, **kwargs):
""" Update file count for work when attachment was saved."""
instance.work.attachment_count += 1
instance.work.save()
è un modo per fare questo lavoro segnale per tutti i modelli ereditato da WorkAttachment
: Ecco il mio codice?
Python 2.7, 1.4 Django pre-alpha
P.S. Ho provato one of the solutions I found on the net, ma non ha funzionato per me.
collegamento Solution è rotto – Martin
ho trovato [pagina soluzione in archivi web] (http: // web. archive.org/web/20120715042306/http://codeblogging.net/blogs/1/14). C'è uno svantaggio della soluzione: dovresti dichiarare il segnale dopo tutte le sottoclassi, altrimenti non le troverà. – HighCat