Решил проблему вот так:
Отнаследовался от admin.ModelAdmin и сделал свой EnchantedModelAdmin
class EnchantedModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
if hasattr(request, 'rest'):
qs = request.rest
else:
qs = super().get_queryset(request)
return qs
Отнаследовался от viewsets.ModelViewSet и сделал свой EnchantedModelViewSet
class EnchantedModelViewSet(viewsets.ModelViewSet):
admin_class = None
def get_queryset(self):
if self.admin_class:
request = self.request
request.rest = super().get_queryset()
return self.admin_class.get_queryset(self, request)
else:
return super().get_queryset()
Теперь в rest framework ViewSet нужно определять вот так:
class ClientViewSet(EnchantedModelViewSet):
queryset = Client.objects.filter()
serializer_class = ClientSerializer
admin_class = ClientAdmin
где admin_class - это класс в админке, на основе которого будет работать get_queryset
в самой админке get_queryset переопределяем вот так:
def get_queryset(self, request):
qs = EnchantedModelAdmin.get_queryset(self, request)
if not request.user.is_superuser:
qs = qs.filter(partner=request.user)
return qs
Всё отлично работает :)
Единственное что - не получилось
qs = EnchantedModelAdmin.get_queryset(self, request)
сделать через super()
Дальше всё буду делать в таком-же ключе
Цель - писать только админку, и что бы restframework работал так-же как она
Весь frontend это либо AngularJS для браузера, либо мобильные приложения для Android/iOS которые используют REST
В результате frontend полностью отделен от backend, что мне очень подходит т.к фронтом занимаются другие люди
Updated 25 March 2015, 14:56 by Artik.