from typing import Optional from rest_framework import serializers from counter.models import DeviceCount, DeviceInfo from mosquito.models import DeviceInfo as MosquitoDeviceInfo from geopy.geocoders import Nominatim class DeviceInfoMobileSerializer(serializers.ModelSerializer): device_name = serializers.SerializerMethodField() status = serializers.SerializerMethodField() coordinate = serializers.SerializerMethodField() # location = serializers.SerializerMethodField() class Meta: model = DeviceInfo fields = [ 'device_id', 'device_name', 'status', 'coordinate', # 'location', ] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.latest = None self.cur_device = None self.geolocator = Nominatim(user_agent="geoapiExercises") def get_device_name(self, obj) -> Optional[str]: qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) if qs.count() > 0: device = qs.first() self.cur_device = device return device.device_name return None def get_status(self, obj) -> int: return obj.online def get_coordinate(self, obj): if self.cur_device: lon, lat = [self.cur_device.longitude, self.cur_device.latitude] if lon and lat: return [lon, lat] return None # TODO: 作为定时任务 # def get_location(self, obj): # if self.cur_device: # lon, lat = [self.cur_device.longitude, self.cur_device.latitude] # if lon and lat: # location = self.geolocator.reverse("{},{}".format(lat, lon)) # address = location.raw['address'] # return address # return None