2016-08-21 3 views
2

In einer django app, mit einer bestehenden Datenbank, die ich benutzt habe inspectdb ein Modell zu bauen:django benutzerdefinierte Eigenschaft Rückgabefeld gefiltert

class Sensorparser(models.Model): 
     """ a read-only implemenation to access the MeshliumDB """ 
     id_wasp = models.TextField(blank=True, null=True) 
     id_secret = models.TextField(blank=True, null=True) 
     frame_type = models.IntegerField(blank=True, null=True) 
     frame_number = models.IntegerField(blank=True, null=True) 
     sensor = models.TextField(blank=True, null=True) 
     value = models.TextField(blank=True, null=True) 
     timestamp = models.DateTimeField() 
     raw = models.TextField(blank=True, null=True) 
     parser_type = models.IntegerField() 

     def save(self, *args, **kwargs): 
      return 

     def delete(self, *args, **kwargs): 
      return 

     class Meta: 
      managed = False 
      db_table = 'sensorParser' 

ich hinzugefügt, um die save und delete Methoden, weil dies ein Lese sein soll - nur Modell.

Eines der Felder ist sensor, das Strings für verschiedene, gut, "Sensoren" (z. B. BAT, ANE, etc.) definiert. Ich möchte eine Eigenschaft wie folgt haben:

@property 
def battery() 
    return self.sensor.objects.filter(sensor='BAT') 

Wie kann ich das erreichen?

Antwort

3

können Sie erstellen custom manager:

class BatteryManager(models.Manager): 
    def get_queryset(self): 
     return super(BatteryManager, self).get_queryset().filter(sensor='BAT') 

class Sensorparser(models.Model): 
    batteries = BatteryManager() 
    # etc 

Und es wie folgt verwenden:

batteries = Sensorparser.batteries.all() 
+0

Und es ist ein bisschen mehr zu verallgemeinern? Die folgende funktioniert nicht: 'Klasse Sensormanager (models.Manager): def get_queryset (self, Sensor). return Super (Sensormanager, Selbst-) .get_queryset() Filter (Sensor = Sensor) ' – John

+1

Ja es funktioniert nicht. Sie können viele Manager für verschiedene Sensortypen erstellen und verwenden. Oder wenn Sie viele Sensortypen haben, können Sie eine benutzerdefinierte Methode im Manager schreiben: 'class SensorparserManager (models.Manager): def filter_by_sensor (self, sensor): zurückgeben self.get_queryset(). Filter (sensor = sensor) class Sensorparser (models.Model): objects = SensorparserManager() 'Und benutze es so 'Sensorparser.objects.filter_by_sensor (' BAT ')' –

0

So etwas wie dies vielleicht:

def _get_battery(self): 
    return self.sensor.objects.filter(sensor='BAT') 
battery = property(_get_battery) 
Verwandte Themen