У меня есть такая модель:
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 для размещения с новыми значениями. Но это не очень хорошее решение, так как мне приходится добавлять каждую новую модель в этот список.
Как «каскадно обновить» все внешние ключи для некоторых объектов перед их удалением?
Или, может быть, есть другие решения, которые можно сделать / избежать слияния