2016-08-21 5 views
2

В приложении Джанго, с существующей базой данных, я использовал inspectdb построить модель:Джанго пользовательское свойство, чтобы вернуть фильтруется поле

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' 

Я добавил save и delete методы, потому что это должно быть для чтения единственная модель.

Одно из полей: sensor, которое определяет строки для разных, хорошо, «датчиков» (например, BAT, ANE и т. Д.). Я бы хотел иметь такую ​​недвижимость:

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

Как это сделать?

ответ

3

Вы можете создать 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 

И использовать его как это:

batteries = Sensorparser.batteries.all() 
+0

И обобщать это немного больше? Ниже не работает: класс 'SensorManager (models.Manager): Защиту get_queryset (самость, датчик):. возвращение супер (SensorManager, самость) .get_queryset() фильтр (датчик = датчик) ' – John

+1

Да он не работает. Вы можете создать много менеджеров для разных типов датчиков и использовать их. Или, если у вас много типов датчиков, вы можете написать собственный метод в менеджере: 'class SensorparserManager (models.Manager): def filter_by_sensor (self, sensor): return self.get_queryset(). Фильтр (датчик = датчик) класс Sensorparser (models.Model): objects = SensorparserManager() 'И используйте его так:' Sensorparser.objects.filter_by_sensor ('BAT') ' –

0

Что-то вроде этого, может быть:

def _get_battery(self): 
    return self.sensor.objects.filter(sensor='BAT') 
battery = property(_get_battery) 
Смежные вопросы