Derzeit habe ich viele Python-Objekte in meinem Code, die den folgenden ähneln:
class MyClass():
def __init__(self, name, friends):
self.myName = name
self.myFriends = [str(x) for x in friends]
Jetzt möchte ich daraus ein Django-Modell machen, bei dem self.myName ein Zeichenfolgenfeld und self.myFriends eine Liste von Zeichenfolgen ist.
from django.db import models
class myDjangoModelClass():
myName = models.CharField(max_length=64)
myFriends = ??? # what goes here?
Da die Liste eine so häufige Datenstruktur in Python ist, habe ich erwartet, dass es ein Django-Modellfeld dafür gibt. Ich weiß, dass ich eine ManyToMany- oder OneToMany-Beziehung verwenden kann, aber ich hatte gehofft, diese zusätzliche Indirektion im Code zu vermeiden.
Bearbeiten:
Ich habe diese verwandte Frage hinzugefügt , die die Leute vielleicht nützlich finden.
python
django
django-models
trauern
quelle
quelle
Antworten:
Wäre diese Beziehung nicht besser als eine Eins-zu-Viele-Fremdschlüsselbeziehung zu einer
Friends
Tabelle auszudrücken? Ich verstehe, dass diesmyFriends
nur Zeichenfolgen sind, aber ich würde denken, dass ein besseres Design darin besteht, einFriend
Modell zu erstellen undMyClass
eine Fremdschlüsselbeziehung zur resultierenden Tabelle zu haben.quelle
"Vorzeitige Optimierung ist die Wurzel allen Übels."
Lassen Sie uns dies vor diesem Hintergrund tun! Sobald Ihre Apps einen bestimmten Punkt erreicht haben, ist es sehr häufig, dass Daten denormalisiert werden. Richtig gemacht, können zahlreiche teure Datenbanksuchen auf Kosten eines etwas höheren Verwaltungsaufwands eingespart werden.
Um einen
list
Freundesnamen zurückzugeben, müssen wir eine benutzerdefinierte Django-Feldklasse erstellen, die beim Zugriff eine Liste zurückgibt.David Cramer hat in seinem Blog einen Leitfaden zum Erstellen eines SeperatedValueField veröffentlicht. Hier ist der Code:
Die Logik dieses Codes befasst sich mit der Serialisierung und Deserialisierung von Werten aus der Datenbank nach Python und umgekehrt. Jetzt können Sie unser benutzerdefiniertes Feld in der Modellklasse einfach importieren und verwenden:
quelle
my_vals = SeparatedValuesField(blank=True, default="")
aber IntegrityError aufgrund von NULL-Werten zu erhalten. Wird das Standardargument nicht korrekt übergeben?to_python
Lesen nicht mehr aufgerufen wird. Damit dies funktioniert, müssen Sie hinzufügen:def from_db_value(self, value, expression, connection, context): return self.to_python(value)
Eine einfache Möglichkeit, eine Liste in Django zu speichern, besteht darin, sie einfach in eine JSON-Zeichenfolge zu konvertieren und diese dann als Text im Modell zu speichern. Sie können die Liste dann abrufen, indem Sie die (JSON-) Zeichenfolge wieder in eine Python-Liste konvertieren. Hier ist wie:
Die "Liste" würde in Ihrem Django-Modell wie folgt gespeichert:
In Ihrer Ansicht / Controller-Code:
Speichern der Liste in der Datenbank:
Abrufen der Liste aus der Datenbank:
Konzeptionell ist hier was los:
quelle
Wenn Sie Django> = 1.9 mit Postgres verwenden, können Sie die Vorteile von ArrayField nutzen
Es ist auch möglich, Array-Felder zu verschachteln:
Wie bereits erwähnt, ist es auch möglich, Elemente direkt abzufragen. Dokumentation Referenz
quelle
Da dies eine alte Frage ist und sich die Django-Techniken seitdem erheblich geändert haben müssen, spiegelt diese Antwort Django Version 1.4 wider und ist höchstwahrscheinlich für Version 1.5 anwendbar.
Django verwendet standardmäßig relationale Datenbanken. du solltest sie benutzen. Ordnen Sie Freundschaften mithilfe von ManyToManyField Datenbankbeziehungen (Fremdschlüsseleinschränkungen) zu. Auf diese Weise können Sie RelatedManager für Freundeslisten verwenden, die intelligente Abfragesätze verwenden. Sie können alle verfügbaren Methoden wie
filter
oder verwendenvalues_list
.Verwenden von
ManyToManyField
Beziehungen und Eigenschaften:Sie können auf folgende Weise auf die Freundesliste eines Benutzers zugreifen:
Beachten Sie jedoch, dass diese Beziehungen symmetrisch sind: Wenn Joseph ein Freund von Bob ist, dann ist Bob ein Freund von Joseph.
quelle
quelle
Denken Sie daran, dass dies schließlich in einer relationalen Datenbank enden muss. Die Verwendung von Beziehungen ist also der übliche Weg, um dieses Problem zu lösen. Wenn Sie unbedingt darauf bestehen, eine Liste im Objekt selbst zu speichern, können Sie sie beispielsweise durch Kommas trennen, in einer Zeichenfolge speichern und dann Zugriffsfunktionen bereitstellen, mit denen die Zeichenfolge in eine Liste aufgeteilt wird. Damit sind Sie auf eine maximale Anzahl von Zeichenfolgen beschränkt und verlieren effiziente Abfragen.
quelle
Wenn Sie Postgres verwenden, können Sie Folgendes verwenden:
Wenn Sie weitere Informationen benötigen, lesen Sie den folgenden Link: https://docs.djangoproject.com/pt-br/1.9/ref/contrib/postgres/fields/
quelle
Sie können praktisch jedes Objekt mit einem Django Pickle Field speichern, unter anderem mit diesem Snippet:
http://www.djangosnippets.org/snippets/513/
quelle
Speichern einer Liste von Zeichenfolgen im Django-Modell:
und Sie können es so nennen:
quelle
Meine Lösung könnte sein, dass sie jemandem hilft:
quelle
Durch die Verwendung einer Eins-zu-Viele-Beziehung (FK von Freund zu übergeordneter Klasse) wird Ihre App skalierbarer (da Sie das Friend-Objekt trivial um zusätzliche Attribute erweitern können, die über den einfachen Namen hinausgehen). Und das ist der beste Weg
quelle