diff --git a/gracedb/superevents/api/mixins.py b/gracedb/superevents/api/mixins.py
index c37e6828537834f8b4a2996ecf54be617d2cfec9..373a67bfea5ad51fa08f48248ae2f00aa4087c07 100644
--- a/gracedb/superevents/api/mixins.py
+++ b/gracedb/superevents/api/mixins.py
@@ -28,3 +28,19 @@ class GetParentSupereventMixin(GetParentMixin):
         # Currently, superevent_id ~ S0001, where 1 is the PK
         return {'id': int(superevent_id[1:])}
 
+
+class BaseGetObjectMixin(object):
+    query_field = None
+
+    def __init__(self, *args, **kwargs):
+        super(BaseGetObjectMixin, self).__init__(*args, **kwargs)
+        if self.query_field is None:
+            self.query_field = self.lookup_field
+
+    def get_object(self):
+        # TODO: do we need some kind of permissions check in here somewhere?
+        queryset = self.filter_queryset(self.get_queryset())
+        query_value = self.kwargs.get(self.lookup_field)
+        filter_kwargs = {self.query_field: query_value}
+        obj = get_object_or_404(queryset, **filter_kwargs)
+        return obj
diff --git a/gracedb/superevents/api/views.py b/gracedb/superevents/api/views.py
index e2fc68bca2166327ff121ed4b72d34446812d0d9..3a5b2332734fe2aaabc74d8def6bb194b47917e4 100644
--- a/gracedb/superevents/api/views.py
+++ b/gracedb/superevents/api/views.py
@@ -22,7 +22,7 @@ from events.view_utils import reverse as gracedb_reverse
 #from events.api.views import IsAuthorizedForPipeline, LigoLwRenderer
 from events.api.backends import LigoAuthentication
 
-from .mixins import GetParentSupereventMixin
+from .mixins import GetParentSupereventMixin, BaseGetObjectMixin
 from .paginators import BasePaginationFactory, CustomLabelPagination, \
     CustomLogTagPagination, CustomSupereventPagination
 from .serializers import SupereventSerializer, SupereventUpdateSerializer, \
@@ -111,11 +111,13 @@ class SupereventEventViewSet(mixins.ListModelMixin,
 
 
 class SupereventLabelViewSet(GetParentSupereventMixin,
+                             BaseGetObjectMixin,
                              viewsets.ModelViewSet):
     """Superevent labels"""
     serializer_class = SupereventLabelSerializer
     pagination_class = CustomLabelPagination
     lookup_field = 'label_name'
+    query_field = 'label__name'
 
     def get_queryset(self):
         superevent = self.get_parent()
@@ -123,13 +125,6 @@ class SupereventLabelViewSet(GetParentSupereventMixin,
         queryset = superevent.labelling_set.all()
         return queryset
 
-    def get_object(self):
-        queryset = self.filter_queryset(self.get_queryset())
-        label_name = self.kwargs.get(self.lookup_field, None)
-        filter_kwargs = {'label__name': label_name}
-        obj = get_object_or_404(queryset, **filter_kwargs)
-        return obj
-
     def destroy(self, request, *args, **kwargs):
         instance = self.get_object()
         remove_label_from_superevent(instance, request.user,
@@ -141,6 +136,7 @@ class SupereventLogViewSet(mixins.ListModelMixin,
                            mixins.RetrieveModelMixin,
                            mixins.CreateModelMixin,
                            GetParentSupereventMixin,
+                           BaseGetObjectMixin,
                            viewsets.GenericViewSet):
     """
     View for log messages attached to a superevent.
@@ -157,18 +153,9 @@ class SupereventLogViewSet(mixins.ListModelMixin,
         # filter for those tagged with external access tagname if is_external(request.user)
         return queryset
 
-    # TODO: generalize this method, can be used for superevent, superevent-event, etc.
-    def get_object(self):
-        logger.warning('can probably do this generically on some mixin')
-        queryset = self.filter_queryset(self.get_queryset())
-        N = self.kwargs.get(self.lookup_field, None)
-        filter_kwargs = {'N': N}
-        obj = get_object_or_404(queryset, **filter_kwargs)
-        logger.warning('check permissions here? or just in get_queryset?')
-        return obj
-
 
 class SupereventLogTagViewSet(GetParentSupereventMixin,
+                              BaseGetObjectMixin,
                               viewsets.ModelViewSet):
     """
     View for tags attached to a log message which is attached to a superevent.
@@ -176,6 +163,7 @@ class SupereventLogTagViewSet(GetParentSupereventMixin,
     serializer_class = SupereventLogTagSerializer
     pagination_class = CustomLogTagPagination
     lookup_field = 'tag_name'
+    query_field = 'name'
 
     def get_parent_log(self):
         # TODO: check superevent permissions here
@@ -187,18 +175,12 @@ class SupereventLogTagViewSet(GetParentSupereventMixin,
         parent_log = self.get_parent_log()
         return parent_log.tags.all()
 
-    def get_object(self):
-        queryset = self.filter_queryset(self.get_queryset())
-        tag_name = self.kwargs.get(self.lookup_field, None)
-        filter_kwargs = {'name': tag_name}
-        obj = get_object_or_404(queryset, **filter_kwargs)
-        return obj
-
     def perform_destroy(self, instance):
         parent_log = self.get_parent_log()
         remove_tag_from_log(parent_log, instance, self.request.user,
             add_log_message=True, issue_alert=True)
 
+
 # TODO: add permissions to this viewset
 class SupereventFileViewSet(GetParentSupereventMixin,
                             viewsets.ViewSet):
@@ -261,6 +243,7 @@ class SupereventVOEventViewSet(mixins.ListModelMixin,
                                mixins.RetrieveModelMixin,
                                mixins.CreateModelMixin,
                                GetParentSupereventMixin,
+                               BaseGetObjectMixin,
                                viewsets.GenericViewSet):
     """
     View for VOEvents attached to a superevent.
@@ -275,14 +258,6 @@ class SupereventVOEventViewSet(mixins.ListModelMixin,
         # filter for those tagged with external access tagname if is_external(request.user)
         return queryset
 
-    # TODO: generalize this method, can be used for superevent, superevent-event, etc.
-    def get_object(self):
-        queryset = self.filter_queryset(self.get_queryset())
-        N = self.kwargs.get(self.lookup_field, None)
-        filter_kwargs = {'N': N}
-        obj = get_object_or_404(queryset, **filter_kwargs)
-        return obj
-
 
 class SupereventEMObservationViewSet(mixins.ListModelMixin,
                                      mixins.RetrieveModelMixin,
@@ -302,10 +277,3 @@ class SupereventEMObservationViewSet(mixins.ListModelMixin,
         # filter for those tagged with external access tagname if is_external(request.user)
         return queryset
 
-    # TODO: generalize this method, can be used for superevent, superevent-event, etc.
-    def get_object(self):
-        queryset = self.filter_queryset(self.get_queryset())
-        N = self.kwargs.get(self.lookup_field, None)
-        filter_kwargs = {'N': N}
-        obj = get_object_or_404(queryset, **filter_kwargs)
-        return obj