【发布时间】:2014-05-07 04:34:29
【问题描述】:
我们有一个标签系统供用户通过定义的标签过滤他们的文件。
以下是模型的设置方式:
class Tags(models.Model):
name = models.CharField(max_length=100)
user = models.ForeignKey(User)
class Files(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100)
tags = models.ManyToManyField(Tags, null=True, blank=True)
现在,因为不需要标签,所以当我们从文件中删除标签时,它们不会被删除。这会留下一堆标签保存在我们的数据库中,我们要清理它们。
我尝试在 Files 模型上重新定义 save 方法和 clean 方法。
我已尝试在 Files 模型上连接 m2m_changed 信号:https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed
我最后尝试的是 pre_save 信号:https://docs.djangoproject.com/en/dev/ref/signals/#pre-save
我计划遍历标签并删除带有空 files_set 的标签,但使用这些方法我无法可靠地解决这个问题(即我最终删除了未关联但即将关联的标签关联(因为 m2m_changed 会以不同的动作触发多次)。
以下是我认为可行的方法:
def handle_tags (sender, instance, *args, **kwargs) :
action = kwargs.get('action')
if action == 'post_clear':
# search through users tags... I guess?
tags = Tags.objects.filter(user=instance.user)
for tag in tags:
if not tag.files_set.exists():
tag.delete()
return
m2m_changed.connect(handle_tags, sender=Files.tags.through)
但是,正如我所说,它会在添加标签之前删除它(如果添加了它,我们显然不想删除它)。
【问题讨论】:
-
你确定this 不能解决你的问题吗?
-
您认为将标签制作成ForeignKeys会更好吗? @yorodm 未标记的文件呢?一个标准的
untagged标签?此外,这将限制我们每个文件只有一个标签。 -
如果您愿意更改代码,也许您可以使用django-taggit,它是 django-apps 的现成标记解决方案。
-
检查this。我认为它会解决你的问题。 @bozdoz
标签: python django many-to-many