私はそのようなモデルを持っています:
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
私はそれらを多くのソースからインポートしており、私のWebサイトのユーザーは新しい場所を追加できるので、管理インターフェースからそれらをマージする方法が必要です。問題は、名前はさまざまな方法で綴ることができるため、あまり信頼できないということです。私は次のようなものを使用するのに慣れています。
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を使用する他のすべてのモデルを新しい値で配置するように更新する必要があります。しかし、このリストにすべての新しいモデルを追加する必要があるため、これはあまり良い解決策ではありません。
一部のオブジェクトを削除する前に、すべての外部キーを「カスケード更新」するにはどうすればよいですか?
または、マージを実行/回避する他のソリューションがあるかもしれません