Ich habe solches Modell:Django: Zusammenführen von Objekten
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
Da ich sie aus vielen Quellen bin importieren, und die Nutzer meiner Website sind in der Lage, neue Orte hinzufügen, ich brauche einen Weg, um sie von einer verschmelzen Admin-Schnittstelle. Das Problem ist, Name nicht sehr zuverlässig ist, da sie auf viele verschiedene Weisen geschrieben werden können, etc Ich bin es gewohnt, so etwas zu verwenden:
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)
Abfrage wie folgt
Place.objects.get(placename__name='St Paul\'s Cathedral', city=london)
und verschmelzen wie Diese
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"
wie Sie sehen können, muss ich alle anderen Modelle mit FK aktualisieren, um mit neuen Werten zu platzieren. Aber es ist keine sehr gute Lösung, da ich jedes neue Modell zu dieser Liste hinzufügen muss.
Wie kaskadiere ich alle Fremdschlüssel für einige Objekte, bevor sie gelöscht werden?
Oder vielleicht gibt es andere Lösungen zu tun/vermeiden
verschmelzenden
FWIW ich dieses Beispiel umfassender gefunden: http://djangosnippets.org/snippets/2283/ – dpn
Snippet nicht für mich scheint mehr zu arbeiten, nicht auf ForeignKey. Die Plus-Transaktion wird zugunsten der Atomkraft abgeschrieben. Plus iteritems() wurde Artikel() in python3. (die letzten beiden Ausgaben waren leicht zu lösen, die erste nicht). – gabn88
in der ersten Ausgabe der Lösung fand ich heraus, dass das Problem mit den groupobjectpermissions von django Wächter wahrscheinlich ist. Könnte es allerdings nicht lösen :( – gabn88