que tengo de estos modelos:Django: objetos que se fusionan
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
Dado que los estoy importando de muchas fuentes, y los usuarios de mi sitio web son capaces de añadir nuevos sitios, que necesitan una manera de unirlos de una interfaz de administrador. El problema es que el nombre no es muy fiable, ya que pueden ser escritos de muchas maneras diferentes, etc Estoy acostumbrado a usar algo como esto:
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)
consulta como esta
Place.objects.get(placename__name='St Paul\'s Cathedral', city=london)
y combinar como esto
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"
Como puedes ver, tengo que actualizar todos los otros modelos con FK para colocar con nuevos valores. Pero no es una solución muy buena ya que tengo que agregar cada nuevo modelo a esta lista.
¿Cómo puedo "actualizar en cascada" todas las claves externas a algunos objetos antes de eliminarlas?
O tal vez hay otras soluciones que hacer/evitar la fusión de
Fwiw me encontré con este ejemplo más completo: http://djangosnippets.org/snippets/2283/ – dpn
no parece fragmentos que trabajar más para mí, falla en ForeignKey. Además, la transacción se deprecia a favor de atómica. Además iteritems() se convirtieron en items() en python3. (los dos últimos números fueron fáciles de resolver, el primero no). – gabn88
Al resolver el primer problema, descubrí que el problema es probable con el groupobjectpermissions de django guardian. Sin embargo, no se pudo resolver :( – gabn88