2011-01-16 2 views
1

Also implementiere ich derzeit ein neues Tagging-System für eine bereits vorhandene Datenbank.Django Modell; Speichern von zusätzlichen Elementen in einem ManyToMany-Feld beim Speichern

Das aktuelle Tagging-System verwendet ein ManyToMany-Feld, jedoch möchte der Client ein kommagetrenntes Eingabefeld (CharField) haben.

So dachte ich am besten Weg, es zu tun, ohne die aktuelle Architektur zu gefährden, ist das neue durch Komma getrennte Feld zu aktivieren, aber die Tags als die frühere ManyToMany-Architektur wegzuschreiben.

Aber wie auch immer ich es versuche, die Tags werden in das Datenbank-Tag-Modell gespeichert, aber nicht auf den Eintrag, für den sie gelten sollen.

Einfacher Überblick:

def save(self, *args, **kwargs): 

    currTags = self.placeHolderTags.split(",") 

    for tag in currTags: 
     dbtag, created = Tag.objects.get_or_create(name=tag) 
     self.tags.add(dbtag) 

    super(BeeldBankEntry, self).save(*args, **kwargs) 

weiteres Modell Hintergrund:

tags   = models.ManyToManyField(Tag, verbose_name='Tags', blank=True) 
placeHolderTags = models.CharField(max_length=400, verbose_name='Tags2', blank=True) 
+0

get_or_create() gibt ein Abfrage-Set zurück, haben Sie versucht get_or_create() [0]? – crodjer

+0

get_or_create gibt ein Tupel von (object, created_flag) –

Antwort

2

Dies ist auf django selbst m2m Felder nach Modell zu speichern. Ich bin mir nicht sicher, ob das Speichern vor Ihrem Code in save() helfen würde, werfen Sie einen Blick auf m2m_change d Signal - es sieht aus wie genau das, was Sie brauchen.

+0

zurück, das eine Endlosschleife verursachen würde, aber ich habe das Hinzufügen von Tags nach super.save() verschoben, aber das hat nicht wirklich funktioniert. Ich werde in das Signal schauen, scheint vielversprechend. – Kasper

+0

das Signal funktioniert! – Kasper