Frage

Ich brauche einige Daten in einem Django-Modell zu speichern. Diese Daten sind nicht gleich alle Instanzen des Modells.

Zuerst dachte ich über das Modell Subklassen, aber ich versuche, die Anwendung flexibel zu halten. Wenn ich Unterklassen verwendet wird, werde ich brauche eine ganze Klasse jedes Mal erstelle ich eine neue Art von Objekt benötigen, und das ist nicht gut. Ich werde auch mit einer Menge von Unterklassen am Ende nur ein Paar von zusätzlichen Feldern zu speichern.

Ich fühle mich wirklich, dass ein Wörterbuch der beste Ansatz sei, aber es gibt nichts in der Django-Dokumentation über ein Wörterbuch in einem Django-Modell zu speichern (oder ich kann es nicht finden).

Irgendwelche Hinweise?

War es hilfreich?

Lösung

Wenn es wirklich wie beliebige Data Dictionary sucht Sie für Sie wahrscheinlich eine Zwei-Ebenen-Setup mit einem Modell verwenden können, die einen Behälter und ein anderes Modell ist das Schlüssel-Wert-Paare ist. Sie würden eine Instanz des Behälters, schaffen jede der Schlüssel-Wert-Instanzen erstellen und den Satz von Schlüssel-Wert-Instanzen mit der Container-Instanz zuordnen. So etwas wie:

class Dicty(models.Model):
    name      = models.CharField(max_length=50)

class KeyVal(models.Model):
    container = models.ForeignKey(Dicty, db_index=True)
    key       = models.CharField(max_length=240, db_index=True)
    value     = models.CharField(max_length=240, db_index=True)

Es ist nicht schön, aber es lasse Dich Zugriff / die Innereien des Wörterbuchs suchen Lösung unter Verwendung der DB während einer Gurke / Serialisierung nicht.

Andere Tipps

Wenn Sie nicht durch eines dieser zusätzlichen Daten abfragen müssen, dann können Sie es speichern als serialisierte Wörterbuch. Verwenden Sie repr das Wörterbuch in einen String zu drehen, und eval die Zeichenfolge wieder in ein Wörterbuch zu drehen. Achten Sie darauf, mit eval, dass es im Wörterbuch keine Benutzerdaten ist, oder eine safe_eval Implementierung verwenden.

Ich kam zu diesem Beitrag von Google 4rth Ergebnis „django Speicherobjekt“

Ein wenig spät, aber django-picklefield sieht aus wie eine gute Lösung für mich.

Beispiel von doc:

zu verwenden, definieren nur ein Feld in Ihrem Modell:

>>> from picklefield.fields import PickledObjectField
>>> class SomeObject(models.Model):
>>>     args = PickledObjectField()

und weisen Sie, was Sie wollen (solange es picklable) auf dem Feld:

>>> obj = SomeObject()
>>> obj.args = ['fancy', {'objects': 'inside'}]
>>> obj.save()

Eine weitere saubere und schnelle Lösung finden Sie hier: https://github.com/bradjasper/django- jsonfield

Der Einfachheit halber kopiert ich die einfachen Anweisungen.

Installieren

pip install jsonfield

Verwendung

from django.db import models
from jsonfield import JSONField

class MyModel(models.Model):
    json = JSONField()

Als Ned beantwortet, werden Sie nicht in der Lage sein, „einige Daten“ zur Abfrage, ob Sie den Wörterbuch-Ansatz verwenden.

Wenn Sie noch Wörterbücher speichern müssen dann den besten Ansatz, bei weitem ist die PickleField Klasse in Marty Alchin neues Buch dokumentiert Pro Django . Diese Methode verwendet Eigenschaften Python-Klasse beizen / unpickle ein Python-Objekt, nur auf Nachfrage, dass in einem Modellfeld gespeichert wird.

Die Grundlagen dieses Ansatzes ist Djangos contibute_to_class Methode, um dynamisch ein neues Feld zu Ihrem Modell hinzufügen und verwendet getattr / setattr die Serialisierung auf Anfrage zu tun.

Eine der wenigen Online-Beispiele, die ich finden konnte, das ist ähnlich ist diese Definition von a JSONField .

Ich bin mir nicht sicher, ganz sicher von der Art des Problems zu lösen Sie versuchen, aber es klingt merkwürdig ähnlich wie Google App Engine BigTable Expando .

Expandos können Sie zusätzliche Felder angeben und speichern auf einer Datenbank-backed Objektinstanz zur Laufzeit. Ein Zitat aus der Dokumentation:

import datetime
from google.appengine.ext import db

class Song(db.Expando):
  title = db.StringProperty()

crazy = Song(title='Crazy like a diamond',
             author='Lucy Sky',
             publish_date='yesterday',
             rating=5.0)

crazy.last_minute_note=db.Text('Get a train to the station.')

Google App Engine unterstützt derzeit sowohl Python und Django-Framework. Könnte lohnt einen Blick in sein, wenn dies der beste Weg, um Ihre Modelle zum Ausdruck bringen.

Traditionelle relationale Datenbank Modelle verfügen nicht über diese Art von säulen zusätzlich Flexibilität. Wenn Ihre Datentypen sind einfach genug, könnte man von den traditionellen RDBMS Philosophie brechen und hacken Werte in eine einzige Spalte über Serialisierung als @ Ned Batchelder schlägt; jedoch, wenn Sie Haben ein RDBMS zu verwenden, ist Django Modell Vererbung wahrscheinlich der Weg zu gehen. Bemerkenswert ist, wird es schaffen einer Eins-zu -on Fremdschlüssel Beziehung für jede Ebene der Ableitung.

Ich bin damit einverstanden, dass Sie anders strukturierte Daten in einer einzigen Spalte verzichten müssen Füllung. Aber wenn Sie das tun müssen, Django hat eine XMLField build-in.

Es gibt auch JSONField bei Django snipplets.

Als „nicht gleich alle Instanzen des Modells“ klingt für mich wie eine gute Übereinstimmung für eine „Schema-freie Datenbank“. CouchDB ist das Aushängeschild für diesen Ansatz und Sie könnten das in Betracht ziehen.

In einem Projekt zog ich mehrere Tabellen, die nie über zu CouchDB sehr schön mit dem Django ORM gespielt und ich bin sehr zufrieden. Ich benutze couchdb-Python , ohne dass die Django-spezifischen CouchDB-Module. Eine Beschreibung des Datenmodells finden Sie hier . Die Bewegung von fünf „Modelle“ in Django 3 „Modelle“ in Django und eine CouchDB „Datenbank“ reduziert sogar leicht die gesamten Codezeilen in meiner Anwendung.

Diese Frage ist alt, aber ich habe das gleiche Problem, hier beendet und die gewählte Antwort könnte mein Problem nicht mehr lösen.

Wenn Sie in Django oder REST-API zum Speichern Wörterbücher mögen, entweder als Objekte in Ihrem Frontend verwendet werden, oder weil Ihre Daten werden nicht notwendigerweise die gleiche Struktur haben, die Lösung, die ich verwenden, können Ihnen helfen.

Wenn die Daten in Ihrer API zu speichern, verwenden json.dump () Methode speichern in einem richtigen jSON-Format zu können, wie sie in dieser Frage beschrieben .

Wenn Sie diese Struktur verwenden, Ihre Daten werden bereits in dem entsprechenden json-Format im Frontend aufgerufen werden, mit JSON.parse () in Ihrem ajax (oder was auch immer) nennen.

Denken Sie darüber nach, und die Gemeinsamkeiten der einzelnen Datensatz finden ... dann Ihr Modell definieren. Es kann die Verwendung von Unterklassen oder nicht benötigen. Fremdschlüssel Gemeinsamkeiten darstellen, werden sie nicht vermieden werden, aber ermutigt, wenn sie Sinn machen.

Stuffing Zufallsdaten in eine SQL-Tabelle ist nicht klug, es sei denn, es ist wirklich nicht-relationale Daten ist. Wenn das der Fall ist, definieren Sie Ihr Problem und wir können in der Lage sein, zu helfen.

Django-Geo enthält eine "DictionaryField" finden Sie vielleicht hilfreich:

http: / /code.google.com/p/django-geo/source/browse/trunk/fields.py?r=13#49

Im Allgemeinen, wenn Sie nicht brauchen, um Abfragen über die Daten, die einen normalisierte Ansatz verwenden, zusätzliche Abfragen zu vermeiden. Benutzereinstellungen sind ein ziemlich gutes Beispiel!

scroll top