2012-04-10 10 views
1

Ich möchte dem Administrator ermöglichen, Daten von einem Drittanbieterdienst zu importieren. Um das zu tun, möchte ich alle möglichen Dinge auflisten, die im Admin-Panel importiert werden sollen, und dem Administrator erlauben zu wählen, was importiert werden soll.
Hier ist, was ich versuche zu tun: überWie erstelle ich eine benutzerdefinierte Datenquelle in Django?

class Movie(models.Model): 
    title = #... 
    length = #... 
    #... 

class ImportManager(models.Manager): 
    def all(self): 
     # what should go here? 

class MovieImporter(Movie): 
    objects = ImportManager() 

    class Meta: 
     proxy = True 
     verbose_name_plural = verbose_name = 'Import Movies' 

admin.site.register(Movie) 
admin.site.register(ImportMovie) 

Ich bin verwirrt, wie kann ich ein QuerySet von ImportManager.all zurück, wenn nicht dort sogar Datenbank ist und es ist nicht von der Dokumentation klar ist es möglich, nur um eine Liste von Objekten an QuerySet zu übergeben. Irgendwelche Ideen?

+1

Meine Zusammenfassung von dem, was Sie wollen: eine neue Modellklasse mit einer externen, wahrscheinlich nur lesbaren, "Datenbank" als Backend implementiert. Ich stelle mir auch vor, dass Sie die Filme in Ihre Hauptdatenbank importieren möchten? Ein separater 'ImportManager' in der 'Movie'-Klasse scheint mir eher das zu sein, was Sie wollen -' Movie.import_objects' oder ähnliches. –

+0

@ChrisMorgan, ja, das möchte ich machen. Aber 'ImportManager' in einem' Film' zu haben, würde es mir nicht erlauben, eine Liste von möglichen Importen separat im Admin-Panel anzuzeigen. Das Problem besteht darin, diese möglichen Importe an Admin zu zeigen, nicht die Importe selbst. – Andrew

Antwort

3

Es wird wahrscheinlich schwierig sein, den integrierten Administrator mit einer externen Nicht-SQL- "Datenbank" zu arbeiten (es sei denn, Sie schreiben ein benutzerdefiniertes DB-Backend, vielleicht django-nonrel oder ein managerartiges Objekt, das zurückgibt implementiert alle Methoden, die der Administrator auf verschiedene Arten verwenden möchte like okm suggests).

Sie könnten es hacken, aber ich wette, Ihre Zeit wird besser nur adding a custom view für Importe ausgeführt werden. Sie können von den Admin-Vorlagen erben und so aussehen, dass sie dem Rest der Admin-Site sehr ähnlich sind.

+0

Danke, eine benutzerdefinierte Ansichten zu erstellen, erweist sich als viel einfacher. – Andrew

0

Es sieht aus wie Sie Ihren eigenen Manager tun. Was Sie in den Methoden Ihres Managers tun müssen, sind nur einige spezielle Fragen an die Datenbank.

https://docs.djangoproject.com/en/dev/topics/db/managers/

Hier haben Sie einige Beispiele, wie Sie einige Methoden für einen benutzerdefinierten Manager erstellen können. Hoffe diese Hilfe.

+0

Danke, ich habe die Dokumente über Manager gelesen, sie sind überhaupt nicht hilfreich, weil es keine "Datenbank" gibt. Ich verwende einen Drittanbieterdienst, um eine Liste möglicher Importe abzurufen. – Andrew

+0

Aber ja, es gibt eine Datenbank. Sehen Sie sich https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods an. Die Methode with_counts rezentriert Datenbankinformationen mithilfe einer benutzerdefinierten Abfrage. Ich glaube, ich verstehe Sie nicht – nicowernli

1

Sie könnten eine ausgewertet QuerySet von

qs = Movie.objects.get_queryset() 
qs._result_cache = map(lambda x: Movie(*x), 
    [(1, 'The Godfather', '175'), ...]) 

und zeigen es in einem Admin Änderungs verspotten. Sie müssen jedoch QuerySet-Methoden hacken und Admin-Operationen wie Filter deaktivieren, um eine zusätzliche echte DB-Abfrage zu verhindern.

Warum einfach nicht einfach Daten mit der lokalen DB synchronisieren und sie mit einem zusätzlichen Statusfeld speichern, das einen Wert wie "admin picked" hat?
Oder Sie könnten die Daten in eine andere Tabelle und synchronisieren Sie die ausgewählten auf die Filmtabelle.

Ein anderer direkter Weg ist es, Mitarbeitern zu erlauben, nach Filmkategorie und anderen möglichen Metabedingungen in der Änderungsliste oder Ihrer angepassten Ansicht zu suchen/filtern und später die Synchronisierung von Filminformationen in der Sellerie-Aufgabe durchzuführen.

Verwandte Themen