2011-01-16 8 views
2

Ich habe ein Modell, das eine gebeizte Reihe von Strings hat. (Es hat gebeizt werden, da Django hat nicht im Set-Feld gebaut, nicht wahr?)Django Admin-Schnittstelle mit gebeiztem Set

class Foo(models.Model): 

    __bar = models.TextField(default=lambda: cPickle.dumps(set()), primary_key=True) 

    def get_bar(self): 
     return cPickle.loads(str(self.__bar)) 

    def set_bar(self, values): 
     self.__bar = cPickle.dumps(values) 

    bar = property(get_bar, set_bar) 

ich das Set im Admin-Interface editierbar sein möchte. Offensichtlich wird der Benutzer nicht direkt mit der gebeizten Saite arbeiten. Außerdem würde die Schnittstelle ein Widget zum Hinzufügen/Entfernen von Zeichenfolgen aus einem Satz benötigen.

Was ist der beste Weg, dies zu tun? Ich bin mit Djangos Admin-System nicht besonders vertraut. Muss ich ein benutzerdefiniertes Admin-Widget oder ähnliches erstellen?

aktualisieren: Wenn ich ein eigenes Widget tun müssen, das sieht hilfreich: http://www.fictitiousnonsense.com/archives/22

Update 2: Jetzt werden verschiedene relationale Modelle zu sehen, ob das funktioniert Ich bin auf der Suche durch. Eine Idee, die ich bin liebäugelt mit:

class FooMember(models.Model): 
     name = models.CharField(max_length=120) 
     foo = models.ForeignKey('Foo') 

class Foo(models.Model): 
     def get_names(self): 
      return FooMember.objects.filter(foo__exact=self) 

Nachteile hierfür sind:

  • Es fühlt sich übermäßig ein ganzes Modell für ein Datenfeld (name) zu machen.
  • Ich möchte die Admin-Schnittstelle für Foo, damit der Benutzer eine Liste von Zeichenfolgen eingeben können. Ich bin nicht sicher, wie man das mit dieser Einrichtung macht; ein benutzerdefiniertes Formular-Widget zu erstellen, scheint weniger Arbeit zu sein.
+0

Ein ManyToManyField ähnelt einem Set. Könnten Sie Ihre Strings "unique = True" -Felder in einem anderen Modell erstellen und ein ManyToManyField dieses Modells in Foo einschließen? –

+0

"Es fühlt sich exzessiv an, ein ganzes Modell für ein Datenfeld (einen Namen) zu erstellen" - es fühlt sich so an, aber das sind nur Zeilen in einer Datenbanktabelle. – osa

Antwort

3

Uhm. Django speichert seine Daten normalerweise in einer SQL-Datenbank. Das Speichern eines Sets als gebeizter String ist definitiv nicht der beste Weg, eine SQL-Datenbank zu verwenden. Es ist nicht sofort klar, welches die richtige Lösung in Ihrem Fall ist, das hängt davon ab, was in diesem Set ist, aber das ist in jedem Fall die falsche Lösung.

Möglicherweise möchten Sie eine neue Tabelle für diesen Satz, oder speichern Sie es zumindest als durch Komma getrennte Werte oder etwas.

+0

Können Sie erklären, warum es falsch ist? Das Set wird nie mehr als 10 Items enthalten, daher brauche ich keine schnellen Lookup-Zeiten. Welchen Vorteil hat CSV auch gegenüber Pickles? (abgesehen davon, dass ich mich mehr beschwere, wenn der Gegenstand, den ich beize, kein Satz ist.) –

+0

Der Vorteil von CSV ist, dass Sie es lesen können, auch wenn Sie Python nicht haben. Wenn Sie alles in Essiggurken wollen, versuchen Sie ZODB eine objektorientierte Datenbank basierend auf Essiggurken, die ziemlich genial ist. Es ist der falsche Ansatz, weil es die SQL-Datenbank verwendet, die Sie haben, es ist nicht tragbar, es ist kompliziert zu implementieren, es ist brüchig und anfällig für das Brechen. Es gibt nichts zwingendes daran. –

Verwandte Themen