我有这样的模型:
class Place(models.Model):
name = models.CharField(max_length=80, db_index=True)
city = models.ForeignKey(City)
address = models.CharField(max_length=255, db_index=True)
# and so on
由于我从许多来源导入它们,并且我网站的用户能够添加新地点,因此我需要一种从管理界面合并它们的方法。问题是,名称不是很可靠,因为它们可以用许多不同的方式拼写,等等我习惯使用这样的东西:
class Place(models.Model):
name = models.CharField(max_length=80, db_index=True) # canonical
city = models.ForeignKey(City)
address = models.CharField(max_length=255, db_index=True)
# and so on
class PlaceName(models.Model):
name = models.CharField(max_length=80, db_index=True)
place = models.ForeignKey(Place)
像这样查询
Place.objects.get(placename__name='St Paul\'s Cathedral', city=london)
并像这样合并
class PlaceAdmin(admin.ModelAdmin):
actions = ('merge', )
def merge(self, request, queryset):
main = queryset[0]
tail = queryset[1:]
PlaceName.objects.filter(place__in=tail).update(place=main)
SomeModel1.objects.filter(place__in=tail).update(place=main)
SomeModel2.objects.filter(place__in=tail).update(place=main)
# ... etc ...
for t in tail:
t.delete()
self.message_user(request, "%s is merged with other places, now you can give it a canonical name." % main)
merge.short_description = "Merge places"
如您所见,我必须使用 FK 将所有其他模型更新为 Place 并使用新值。但这不是很好的解决方案,因为我必须将每个新模型都添加到此列表中。
如何在删除某些对象之前“级联更新”所有外键?
或者也许还有其他解决方案可以做/避免合并