2016-03-27 13 views
0

Kann man in Django ein Tupelfeld von Model speichern? In meinem Fall habe ich einen Model Translator. Der Übersetzer sollte Informationen darüber speichern, welche Sprachen er übersetzen kann. Aber es kann Situationen geben, in denen der Übersetzer nicht vom Englischen ins Deutsche übersetzen kann, aber er/sie kann das in umgekehrter Richtung tun.Wie speichert man die Liste der Tupel im Django-Modell?

So ein Objekt Übersetzer könnte dies speichern:

  • von Deutsch auf Englisch
  • von Niederländisch auf Englisch

aber er kann nicht aus dem Englischen ins Deutsche oder Niederländisch übersetzen.

Also was ich wahrscheinlich suche ist Tupel von Modellen zu speichern (es gibt ein Modell namens Sprache).

+0

Warum müssen Sie ein Touple speichern, wenn Sie nur mehrere Spalten speichern können? From-lan to-lan von-str bis-str – dkarchmer

+0

Oder schauen Sie in Beize oder JSONField. https://pypi.python.org/pypi/django-picklefield und https://github.com/bradjasper/django-jsonfield –

Antwort

3

Die Lösung, die ich empfehle, wäre, ein Modell zu erstellen, um jede unidirektionale Übersetzung darzustellen und dann eine ManyToManyField-Beziehung zu verwenden.

Zum Beispiel:

class LanguagePair(models.Model): 
    from_language = models.CharField(max_length=220) 
    to_language = models.CharField(max_length=220) 

class Translator(models.Model): 
    languages = models.ManyToManyField('LanguagePair') 
    ... 

So würde jeder Übersetzer mehr LanguagePair Objekte mit ihm verbunden hat, dass die Sprachen repräsentiert sie übersetzen kann.

Damit können Sie leicht alle Übersetzer abfragen, die eine bestimmte Sprache übersetzen können, da die eigentliche Übersetzung ein Objekt ist. Ich würde auch empfehlen, dass stattdessen als Speichern von Sprachen in CharField s Sie tatsächlich ein anderes Language Modell und ändern Sie das LanguagePair Modell, um zwei ForeignKey Felder für die Sprache zu haben. Eine alternative Lösung wäre, die Liste oder die Sprachpaare aus einer Standard-Python-Liste zu serialisieren und sie als JSON-String in einer CharField zu speichern, aber dies würde die Abfragen erschweren und könnte in Zukunft ein Problem sein. Es ist im Allgemeinen eine gute Idee, keine Angst davor zu haben, Logik in separate Modelle aufzuteilen, da dies zu einem flexibleren und skalierbaren Ansatz führt.

+0

Danke, das ist wahrscheinlich eine gute Lösung, aber ich wollte es so einfach wie möglich machen. Ich wähle diesen Weg. Noch eine Frage - warum setzen Sie LanguagePair als String statt als Zeilenklasse? –

+0

Nur Gewohnheit ... Wenn Sie eine Zeichenkette verwenden, kann sie auf ein Modell verweisen, das danach definiert ist, und Sie können auch Modelle aus anderen Anwendungen referenzieren, ohne sie wie folgt zu importieren: 'app.LanguagePair'. Aber Sie haben Recht, in diesem Beispiel war es nicht notwendig. Ich würde auch argumentieren, dass dies * die einfachste Lösung ist, die es ermöglicht, Nachschläge zu machen, ohne etwas entschlüsseln zu müssen, und Ihnen eine bessere Leistung geben wird. Es ist auch flexibler, wenn Sie jemals etwas Komplexeres in der Zukunft tun müssen. – joshcarllewis

Verwandte Themen