我想在具有中间模型的多对多关系模型中添加项目时触发信号。
这些是下面的模型。
class Page(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
url = models.TextField('Website Page URL', null=False, blank=False, unique=True)
site = models.ForeignKey(Site, related_name='pages', on_delete=models.CASCADE)
class Link(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
url = models.CharField('Page Link', max_length=600, null=False, blank=False, unique=True)
pages = models.ManyToManyField(Page, related_name='links', through='PageLinkAssociation')
class PageLinkAssociation(models.Model):
page = models.ForeignKey(Page, on_delete=models.CASCADE)
link = models.ForeignKey(Link, on_delete=models.CASCADE)
在这些模型类上可以看到, Page 和 Link 类的url
字段是unique
。
下面的代码段代表了我向这三个表中添加项目的方式。
links = kwargs.get('links', None)
for link in links:
try:
link_obj = PageLink.objects.create(url=link)
PageLinkAssociation.objects.create(page=page, link=link_obj)
except IntegrityError:
link_obj = PageLink.objects.get(url=link)
PageLinkAssociation.objects.create(page=page, link=link_obj)
通过这种方式,可以将项目正确地添加到表中。
我担心的是,我想在每个link_obj
添加到 Link 表之后触发信号。
我已经看到 post_save 无法正常工作。
Django文档告诉我,我应该使用 m2m_changed 进行m2m关系,但是我不确定这是正确的方法。