我有这样的模式:Django的:合并对象
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更新所有其他模型以放置新的值。但这不是很好的解决方案,因为我必须将每个新模型添加到此列表中。
如何在删除某些对象之前“级联更新”所有外键?
或者,也许还有其他的解决方案做/避免合并
FWIW,我发现这个例子更全面:http://djangosnippets.org/snippets/2283/ – dpn 2013-04-24 05:44:31
片段似乎并没有为我工作了,在失败的ForeignKey。 Plus交易贬值以支持原子。加iteritems()成为python3中的项目()。 (最后两个问题很容易解决,首先不是)。 – gabn88 2015-11-15 09:32:36
在解决第一个问题时,我发现问题可能与django guardian的groupobjectpermissions有关。无法解决它:( – gabn88 2015-11-15 09:55:12