0
0
DjangoHow-ToBeginner · 3 min read

How to Limit Queryset in Django Admin: Simple Guide

To limit the queryset in Django admin, override the get_queryset method in your ModelAdmin class. This method lets you filter or restrict the objects shown in the admin list view by returning a custom queryset.
📐

Syntax

Override the get_queryset method inside your ModelAdmin subclass. This method receives the request object and should return a filtered queryset.

  • self: the admin class instance
  • request: the current HTTP request
  • Return: a queryset filtered as needed
python
class MyModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # filter qs as needed
        return qs
💻

Example

This example shows how to limit the admin list to only show objects created by the logged-in user.

python
from django.contrib import admin
from .models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(created_by=request.user)

admin.site.register(MyModel, MyModelAdmin)
Output
In the Django admin, only objects where the <code>created_by</code> field matches the logged-in user will be listed.
⚠️

Common Pitfalls

Common mistakes include not calling super().get_queryset(request), which can break default admin behavior. Another pitfall is filtering without considering permissions, which might hide data unintentionally.

Also, avoid filtering by fields that do not exist or are not indexed, as this can cause errors or slow queries.

python
class WrongAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        # Missing super call - breaks admin
        return MyModel.objects.filter(active=True)

class CorrectAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(active=True)
📊

Quick Reference

  • Override get_queryset(self, request) in your ModelAdmin.
  • Always call super().get_queryset(request) first.
  • Return a filtered queryset based on your criteria.
  • Use request.user to customize per user.
  • Test your filters to avoid hiding all objects accidentally.

Key Takeaways

Override get_queryset in ModelAdmin to control which objects appear in admin.
Always call super().get_queryset(request) to keep default admin behavior.
Use request.user to filter objects per logged-in user if needed.
Test your queryset filters to avoid hiding all data unintentionally.
Filtering by non-existent fields or without permissions can cause errors.