2016-12-01 1 views
0

Ich schreibe eine Django-basierte App, wo ich ein Modell habe, das verschiedene Bildtypen kapselt. Ich lade sie als Einbauten wie folgt:Hinzufügen von Metadaten für Modelle und Objekte in Django

[ 
    { 
    "model": "app.ImageTypeModel", 
    "pk": 1, 
    "fields": { 
     "type": "PNG", 
     "dims": 1 
    } 
    }, 

    { 
    "model": "app.ImageTypeModel", 
    "pk": 2, 
    "fields": { 
     "type": "Custom", 
     "dims": 100 
    } 
    }, 

    { 
    "model": "app.ImageTypeModel", 
    "pk": 3, 
    "fields": { 
     "type": "JPEG", 
     "dims": 1 
    } 
    }, 

    { 
    "model": "app.ImageTypeModel", 
    "pk": 4, 
    "fields": { 
     "type": "BMP", 
     "dims": 1 
    } 
    } 
] 

Das entsprechende Modell-Deklaration lautet wie folgt:

class ImageTypeModel(models.Model): 
    type = models.CharField(max_length=100) 
    dims = models.IntegerField() 

    class Meta: 
     db_table = "image_type" 

Außerdem habe ich verschiedene Instanzen von Bildern haben wie folgt (ich habe einige Felder zur Vereinfachung entfernt):

class ImageModel(models.Model): 
    type = models.ForeignKey(ImageTypeModel) 

    class Meta: 
     db_table = "images" 

Jetzt für jeden dieser Bildtypen, habe ich verschiedene Eigenschaften, die ich angeben möchte. Zum Beispiel könnte ich für ein Bild vom Typ Custom verschiedene Eigenschaften haben, von denen jeder ein bestimmter Datentyp sein könnte (wie Integer, String, Floats, Vektoren von Floats etc.). Eine Möglichkeit, dies zu definieren, wäre eine Tabelle für diese Datentypen und zusätzliche Tabellen für jeden der Bildtypen (nennen wir diese Tabellen Konfigurationstabellen), wobei jede Zeile der Name der Eigenschaft und der zugehörige Datentyp wäre. Ich kann dann versuchen, ein automatisches Formular basierend darauf zu generieren.

Ich bin mir jedoch nicht sicher, wie Sie die Bildtypen und die zugehörigen Konfigurationstabellen zuordnen. Also, ist es in meinem ursprünglichen Fixture-Beispiel ratsam, einfach den Namen der Datenbanktabelle als ein anderes Feld hinzuzufügen? Oder sollte ich Modelle für jede dieser Konfigurationstabellen erstellen, aber ich bin nicht sicher, wie diese Modelle in meinem Fixture-Code verweisen.

Also, auf der Suche nach Ratschlägen, wie man sich dieser Art von Problem nähert, wo man auch diesen König von metadata für Objekte im Backend angeben muss und wie es mit Django-Modellen und Fixtures passen kann.

Antwort

2

Sie können allgemeines Verhalten in einer abstrakten Basisklasse definieren und in untergeordneten Klassen nur die Unterschiede, die sich unterscheiden: Django unterstützt .

class Image(models.Model): 
    """ A graphic image. """ 

    name = models.CharacterField(max_length=1024) 
    suffix = NotImplemented 

    class Meta: 
     abstract = True 


class SVGImage(Image): 
    """ A graphic image in Scalable Vector Graphics (SVG) format. """ 

    suffix = ".svg" 
    version = models.CharacterField(max_length=20) 


class JPEGImage(Image): 
    """ A graphic image in Joint Picture Experts Group (JPEG) format. """ 

    suffix = ".jpeg" 
    resolution = models.IntegerField() 

Nun ist die Image Modell nicht in der Datenbank dargestellt werden, aber alle seine definierte Funktionalität zu Kind-Klassen zur Verfügung. Eine Instanz von SVGImage wird name, suffix und version Attribute haben; Eine Instanz von JPEGImage hat die Attribute name, suffix und resolution.


Als Nebenwirkung: Ihre Django-Modelle in einem Modul models genannt werden, so sollten Sie die überflüssige …Model Suffix an die Klassennamen hinzufügen.

Stattdessen ist fooapp.models.JPEGImage genug klar genug; Es bedeutet auch, dass Ihre Datenbanktabellen richtig benannt werden, ohne dass Sie dies angeben müssen.

+0

Danke für die Antwort! Ich denke, dass ich dann auch meine Fixtures erweitern kann, um diese zusätzlichen Attribute auf die gleiche Weise zu integrieren. Danke auch für die Heads Up auf der Namenskonvention. – Luca

Verwandte Themen