2016-04-12 9 views
2

Ich habe eine Django-App, wo Werte in einer Tabelle vom Benutzer neu angeordnet werden können und neue Werte hinzugefügt werden können und alte Werte gelöscht werden können.Django-Modellfeld für benutzerdefinierbare benutzerdefinierte Reihenfolge

Was ist der "richtige" Weg, dies zu tun?

konnte ich order = models.IntegerField()

definieren und dann die vom Benutzer definierte für jede Zeile auf den richtigen Wert, um die richtige individuelle Bestellung zu erstellen. ABER dies hat den großen Nachteil, dass bei jeder Nachbestellung jede Zeile nach der Änderung mit einer neuen order aktualisiert werden muss. Ich könnte den Code etwas schlauer machen und die Ganzzahl definieren, die auf halbem Wege zwischen der vorherigen und der nächsten liegt - aber das bedeutet immer noch, dass gelegentlich ein Konflikt entsteht und alle Zeilen aktualisiert werden müssen.

Eine mögliche Lösung ist die Verwendung eines Floats. Dann kann die Reihenfolge einer eingefügten Zeile immer in der Mitte zwischen der vorherigen und der nächsten liegen ... Gibt es mögliche Probleme bei der Verwendung eines Gleitkommas zur Sortierung (insbesondere wenn die Anzahl der Zeilen sehr hoch wird).

Gibt es eine bessere/intelligentere/mehr integrierte Möglichkeit, so etwas zu handhaben?

+0

Sie sollten nicht versuchen, eine Datenbank zu bestellen. Nur was dem Benutzer angezeigt wird, also entweder die abfragenden Sets bestellen oder Möglichkeiten zur Speicherung der Benutzerbestellung angeben – Sayse

+0

Sorry, ich war nicht klar - genau das möchte ich machen. (Ordne die Abfragesätze an/speichere die Benutzereinstellungen). Was ich frage mich ist, was ist der richtige Weg, dies zu tun (wenn es viele und viele Anpassungen/Einfügungen/Löschungen/etc) – EMon

+0

Ihre Frage ist über die Speicherung der Reihenfolge, die immer fehlerhaft sein wird. Sie müssen die Reihenfolge Präferenz speichern, zum Beispiel können Sie Antworten auf Stack-Overflow bestellen, wie aktiv sie sind oder wie viele Stimmen sie haben – Sayse

Antwort

2

Ich bin interessiert, weitere clevere Lösungen zu hören, aber ich bezweifle, dass es etwas einfacher als Integer Bestellfeld, das ist, was ich verwendet habe.

Um Wertkonflikte zu vermeiden, müssen Sie die Benutzer nicht direkt diesen Wert anpassen lassen, sondern automatisch hinter den Kulissen basierend auf einer Art von Bestell-GUI (Drag and Drop, usw.). Der Arbeitsablauf würde so aussehen: Dem Benutzer eine Liste anzeigen lassen, sie neu anordnen lassen, wie sie wollen, die gesamte Liste in der richtigen Reihenfolge zurücksenden und die Reihenfolge für jeden Datensatz aktualisieren, beginnend mit 1 bis +1.

Wenn Sie erwarten, dass Benutzer nur gelegentlich ein Paar Elemente austauschen oder neue Elemente in die Mitte einfügen, können Sie die Bestellung mithilfe von UPDATE-Abfragen aktualisieren, ohne die Liste manuell durchlaufen zu müssen (UPDATE table set orderid = orderid + 1 where orderid >= :position) bestimmte Position, usw.).

Sie sollten nicht zu viele Einträge in dieser Liste haben, um sich Gedanken über die DB-Update-Leistung zu machen, da Benutzer die Elemente irgendwie manuell sortieren müssen. Sie können ihnen keine Millionen Datensätze zum Sortieren geben. Wenn dies der Fall ist, müssen Sie wahrscheinlich etwas extra tun, damit die Anzahl der Elemente, die Benutzer bestellen, überschaubar ist.

+0

danke! Ich habe github.com/jpwatts/django-positions gefunden, die ich ausprobieren kann - obwohl es mich betrifft, dass es einige Bugs in diesem Paket gibt.Es kann sinnvoll sein, einfach mit dem zu gehen, was Sie vorgeschlagen haben - obwohl ich der Meinung bin, dass diese App erweitert werden kann, um Benutzern zu ermöglichen, kleine Teile einer größeren Liste zu bearbeiten (und somit möglicherweise Millionen von Einträgen)). Haben Sie die Float-Idee oder die "breite Palette von ganzen Zahlen" in Betracht gezogen? – EMon

+0

Dieses Paket könnte sogar besser sein als die Django-Positionen, die ich in meinem vorherigen Kommentar erwähnt habe: https://github.com/bfirsh/django-ordered-model – EMon

+0

Floats und Integer mit einigen Lücken (100, 200, ...) sind gut, wenn Sie die Zahlen manuell ändern, ist es bequem, nur eine Zahl gelegentlich in db ändern und vergessen Sie es. Wenn Sie es automatisch tun, müssen Sie einige zusätzliche Überprüfungen hinzufügen, die den Zweck einer einfacheren Option vereiteln könnten. Ich habe keine dieser Bibliotheken benutzt, probiere sie aus, klingt, als ob sie immer noch ein Integer-Ordering-Feld mit einigen Convenience-Wrappern verwenden, was hilfreich sein könnte. – serg

Verwandte Themen