2009-08-21 12 views
1

ist es möglich, Django-Apps zu schreiben, zum Beispiel für den internen/persönlichen Gebrauch mit bestehenden Datenbanken, ohne den "Overhead" von Djangos eigenen Tabellen zu haben, die normalerweise beim Start eines Projekts installiert werden? Ich möchte vorhandene Tabellen über Modelle verwenden, aber nicht alle anderen Sachen, die auf normalen Webseiten sicherlich nützlich sind.Django ohne zusätzliche Tabellen?

Der Grund wäre, kleine persönliche Inspektions-/Admin-Tools zu erstellen, ohne auf Legacy-Datenbanken einzugreifen.

Antwort

1

Die am meisten bemerkenswerte App mit definierten Datenbanktabellen ist django.contrib.auth, die ihr eigenes Auth-Backend in der Datenbank implementiert. Sie könnten wahrscheinlich Auth alle überspringen, wenn Ihre App Firewall ist und Sie allen Menschen vertrauen, die Zugriff darauf haben. Wenn Sie andernfalls einen eigenen Authentifizierungsmechanismus mithilfe der vorhandenen Infrastruktur erstellen möchten, möchten Sie höchstwahrscheinlich ein anderes Back-End verwenden. Wenn Ihr Webserver REMOTE_USER setzt, können Sie another builtin backend verwenden, und Sie sollten aus und ausgeführt werden. Andernfalls müssen Sie Ihre eigenen implementieren, um auf andere Authentifizierungsquellen zu verweisen.

Von dort müssen Sie Ihre Modelle nur so einrichten, dass sie vorhandene Datenbanktabellen verwenden, anstatt sie selbst erstellen zu lassen. Sie können sehr feine Kontrolle über diese haben, zum Beispiel

class MyModel(django.db.Model): 
    MyTextField = django.db.TextField(db_column="mytextfield", primary_key=True) 

    class Meta: 
     db_table = "my_table" 

diese Weise können Sie die genaue Tabelle angeben und Spalten, aus denen jedes Feld eines jeden Modells darstellen soll. Beachten Sie, dass Sie den Primärschlüssel als einen anderen Typ als Integer festlegen können. Eine Einschränkung von Djangos ORM ist, dass jedes Modell genau einen Primärschlüssel haben muss. Wenn Sie also keinen Primärschlüssel für Ihren Tisch haben, fügen Sie entweder einen hinzu oder Sie müssen ohne die Hilfe von djangos ORM auskommen.

Da Sie sich an einen vorhandenen Datensatz binden, der sich möglicherweise auf andere Anwendungen bezieht, werden Sie wahrscheinlich nicht ./manage.py syncdb verwenden wollen, da dies zu unerwünschten Ereignissen führen kann.

+0

Vielen Dank, das war genau die Antwort, die ich suchte! :-) –

3

Django installiert selbst keine Tabellen. Es kommt mit einigen vorgefertigten Anwendungen, die Tabellen installieren, aber diese können leicht deaktiviert werden, indem sie aus der INSTALLED_APPS Einstellung entfernt werden.

+0

ich weiß, ist es einfach, von den Namen natürlich zu erkennen. Was ich meine ist, wie weit kann ich ohne sie gehen? –

+0

Nun, Sie können keine Anwendung verwenden, die sie benötigt. Wenn Sie beispielsweise die Benutzer- und Berechtigungstabellen nicht möchten, können Sie Django-Benutzer nicht authentifizieren. –

0

Installieren Sie keine von Djangos integrierten Apps und verwenden Sie keine models.py in Ihren Apps. Ihre Datenbank enthält null Tabellen.

Sie haben keine Benutzer, Websites oder Sitzungen - das sind Django-Funktionen, die die Datenbank verwenden.

AFAIK sollten Sie jedoch immer noch eine SQLite-Datenbank haben. Ich denke, Teile von Django gehen davon aus, dass Sie eine Datenbankverbindung haben und versuchen, diese Verbindung herzustellen.

Es ist ein einfaches Experiment zu versuchen.

0

Kommentieren Sie einfach die django App-Strings des INSTALLED_APPS-Tupels in Ihrer Projektdatei settings.py (am Anfang des Projekts, bevor Sie syncdb ausführen).

2

hinzufügen Sie können auch nur eine zusätzliche Datenbank (es als Standard festgelegt) in das zusätzliche django Kopf Zeug hält:

DATABASES = { 
    'default': { 
      'ENGINE' : 'django.db.backends.sqlite', 
      'NAME'  : 'djangoOverhead', 
      'USER'  : '', 
      'PASSWORD' : '', 
      'HOST'  : 'localhost' }, 
    'legacyAppTables': { 
      'ENGINE' : 'django.db.backends.mysql', 
      'NAME'  : 'legacyAppTables', 
      'USER'  : '', 
      'PASSWORD' : '', 
      'HOST'  : 'someRemoteHost' }, } 
Verwandte Themen