我有這樣的模式: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