In some application, we need to track which user added or updated the data in the system. So here we will see how to do this job in the background without any user input.
Required setup:
I hope you already have Django and the Django Rest Framework installed. If not, please install these first.
run –
pip install Djangopip install djangorestframeworkpip install Django pip install djangorestframeworkpip install Django pip install djangorestframework
Enter fullscreen mode Exit fullscreen mode
Settings:
In your settings.py
add ‘rest_framework’ and your internal apps e.g. ‘api’.
<span>INSTALLED_APPS</span> <span>=</span> <span>[</span><span>#...... </span><span># third-party packages </span> <span>'</span><span>rest_framework</span><span>'</span><span>,</span><span># internal apps </span> <span>'</span><span>api</span><span>'</span><span>,</span><span>]</span><span>INSTALLED_APPS</span> <span>=</span> <span>[</span> <span>#...... </span> <span># third-party packages </span> <span>'</span><span>rest_framework</span><span>'</span><span>,</span> <span># internal apps </span> <span>'</span><span>api</span><span>'</span><span>,</span> <span>]</span>INSTALLED_APPS = [ #...... # third-party packages 'rest_framework', # internal apps 'api', ]
Enter fullscreen mode Exit fullscreen mode
Write models:
Define your applications model in models.py
<span>from</span> <span>django.db</span> <span>import</span> <span>models</span><span>from</span> <span>django.conf</span> <span>import</span> <span>settings</span><span>class</span> <span>Student</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span><span>name</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>180</span><span>)</span><span>programme</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>250</span><span>)</span><span>batch</span> <span>=</span> <span>models</span><span>.</span><span>SmallIntegerField</span><span>()</span><span>roll</span> <span>=</span> <span>models</span><span>.</span><span>SmallIntegerField</span><span>()</span><span>created_by</span> <span>=</span> <span>models</span><span>.</span><span>ForeignKey</span><span>(</span><span>settings</span><span>.</span><span>AUTH_USER_MODEL</span><span>,</span> <span>on_delete</span><span>=</span><span>models</span><span>.</span><span>SET_NULL</span><span>,</span> <span>related_name</span><span>=</span><span>'</span><span>created_by</span><span>'</span><span>,</span> <span>blank</span><span>=</span><span>True</span><span>,</span> <span>null</span><span>=</span><span>True</span><span>)</span><span>updated_by</span> <span>=</span> <span>models</span><span>.</span><span>ForeignKey</span><span>(</span><span>settings</span><span>.</span><span>AUTH_USER_MODEL</span><span>,</span> <span>on_delete</span><span>=</span><span>models</span><span>.</span><span>SET_NULL</span><span>,</span> <span>related_name</span><span>=</span><span>'</span><span>updated_by</span><span>'</span><span>,</span> <span>blank</span><span>=</span><span>True</span><span>,</span> <span>null</span><span>=</span><span>True</span><span>)</span><span>from</span> <span>django.db</span> <span>import</span> <span>models</span> <span>from</span> <span>django.conf</span> <span>import</span> <span>settings</span> <span>class</span> <span>Student</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span> <span>name</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>180</span><span>)</span> <span>programme</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>250</span><span>)</span> <span>batch</span> <span>=</span> <span>models</span><span>.</span><span>SmallIntegerField</span><span>()</span> <span>roll</span> <span>=</span> <span>models</span><span>.</span><span>SmallIntegerField</span><span>()</span> <span>created_by</span> <span>=</span> <span>models</span><span>.</span><span>ForeignKey</span><span>(</span><span>settings</span><span>.</span><span>AUTH_USER_MODEL</span><span>,</span> <span>on_delete</span><span>=</span><span>models</span><span>.</span><span>SET_NULL</span><span>,</span> <span>related_name</span><span>=</span><span>'</span><span>created_by</span><span>'</span><span>,</span> <span>blank</span><span>=</span><span>True</span><span>,</span> <span>null</span><span>=</span><span>True</span><span>)</span> <span>updated_by</span> <span>=</span> <span>models</span><span>.</span><span>ForeignKey</span><span>(</span><span>settings</span><span>.</span><span>AUTH_USER_MODEL</span><span>,</span> <span>on_delete</span><span>=</span><span>models</span><span>.</span><span>SET_NULL</span><span>,</span> <span>related_name</span><span>=</span><span>'</span><span>updated_by</span><span>'</span><span>,</span> <span>blank</span><span>=</span><span>True</span><span>,</span> <span>null</span><span>=</span><span>True</span><span>)</span>from django.db import models from django.conf import settings class Student(models.Model): name = models.CharField(max_length=180) programme = models.CharField(max_length=250) batch = models.SmallIntegerField() roll = models.SmallIntegerField() created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name='created_by', blank=True, null=True) updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name='updated_by', blank=True, null=True)
Enter fullscreen mode Exit fullscreen mode
Write Serializers:
Inside your application, add a file called serializers.py
and define a serializer class for your model as follows:
<span>from</span> <span>rest_framework</span> <span>import</span> <span>serializers</span><span>from</span> <span>.models</span> <span>import</span> <span>Student</span><span>class</span> <span>StudentModelSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span><span>created_by</span> <span>=</span> <span>serializers</span><span>.</span><span>StringRelatedField</span><span>(</span><span>default</span><span>=</span><span>serializers</span><span>.</span><span>CurrentUserDefault</span><span>(),</span> <span>read_only</span><span>=</span><span>True</span><span>)</span><span>updated_by</span> <span>=</span> <span>serializers</span><span>.</span><span>StringRelatedField</span><span>(</span><span>default</span><span>=</span><span>serializers</span><span>.</span><span>CurrentUserDefault</span><span>(),</span> <span>read_only</span><span>=</span><span>True</span><span>)</span><span>class</span> <span>Meta</span><span>:</span><span>model</span> <span>=</span> <span>Student</span><span>fields</span> <span>=</span> <span>[</span><span>'</span><span>id</span><span>'</span><span>,</span> <span>'</span><span>name</span><span>'</span><span>,</span> <span>'</span><span>programme</span><span>'</span><span>,</span> <span>'</span><span>batch</span><span>'</span><span>,</span> <span>'</span><span>roll</span><span>'</span><span>,</span> <span>'</span><span>created_by</span><span>'</span><span>,</span> <span>'</span><span>updated_by</span><span>'</span><span>]</span><span>from</span> <span>rest_framework</span> <span>import</span> <span>serializers</span> <span>from</span> <span>.models</span> <span>import</span> <span>Student</span> <span>class</span> <span>StudentModelSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span> <span>created_by</span> <span>=</span> <span>serializers</span><span>.</span><span>StringRelatedField</span><span>(</span><span>default</span><span>=</span><span>serializers</span><span>.</span><span>CurrentUserDefault</span><span>(),</span> <span>read_only</span><span>=</span><span>True</span><span>)</span> <span>updated_by</span> <span>=</span> <span>serializers</span><span>.</span><span>StringRelatedField</span><span>(</span><span>default</span><span>=</span><span>serializers</span><span>.</span><span>CurrentUserDefault</span><span>(),</span> <span>read_only</span><span>=</span><span>True</span><span>)</span> <span>class</span> <span>Meta</span><span>:</span> <span>model</span> <span>=</span> <span>Student</span> <span>fields</span> <span>=</span> <span>[</span><span>'</span><span>id</span><span>'</span><span>,</span> <span>'</span><span>name</span><span>'</span><span>,</span> <span>'</span><span>programme</span><span>'</span><span>,</span> <span>'</span><span>batch</span><span>'</span><span>,</span> <span>'</span><span>roll</span><span>'</span><span>,</span> <span>'</span><span>created_by</span><span>'</span><span>,</span> <span>'</span><span>updated_by</span><span>'</span><span>]</span>from rest_framework import serializers from .models import Student class StudentModelSerializer(serializers.ModelSerializer): created_by = serializers.StringRelatedField(default=serializers.CurrentUserDefault(), read_only=True) updated_by = serializers.StringRelatedField(default=serializers.CurrentUserDefault(), read_only=True) class Meta: model = Student fields = ['id', 'name', 'programme', 'batch', 'roll', 'created_by', 'updated_by']
Enter fullscreen mode Exit fullscreen mode
Admin:
You can register your model in admin.py
in case you want to add data from the Django admin panel:
<span>from</span> <span>django.contrib</span> <span>import</span> <span>admin</span><span>from</span> <span>.models</span> <span>import</span> <span>Student</span><span>@admin.register</span><span>(</span><span>Student</span><span>)</span><span>class</span> <span>StudentAdmin</span><span>(</span><span>admin</span><span>.</span><span>ModelAdmin</span><span>):</span><span>list_display</span> <span>=</span> <span>[</span><span>'</span><span>id</span><span>'</span><span>,</span> <span>'</span><span>name</span><span>'</span><span>,</span> <span>'</span><span>programme</span><span>'</span><span>,</span> <span>'</span><span>batch</span><span>'</span><span>,</span> <span>'</span><span>roll</span><span>'</span><span>]</span><span>from</span> <span>django.contrib</span> <span>import</span> <span>admin</span> <span>from</span> <span>.models</span> <span>import</span> <span>Student</span> <span>@admin.register</span><span>(</span><span>Student</span><span>)</span> <span>class</span> <span>StudentAdmin</span><span>(</span><span>admin</span><span>.</span><span>ModelAdmin</span><span>):</span> <span>list_display</span> <span>=</span> <span>[</span><span>'</span><span>id</span><span>'</span><span>,</span> <span>'</span><span>name</span><span>'</span><span>,</span> <span>'</span><span>programme</span><span>'</span><span>,</span> <span>'</span><span>batch</span><span>'</span><span>,</span> <span>'</span><span>roll</span><span>'</span><span>]</span>from django.contrib import admin from .models import Student @admin.register(Student) class StudentAdmin(admin.ModelAdmin): list_display = ['id', 'name', 'programme', 'batch', 'roll']
Enter fullscreen mode Exit fullscreen mode
View:
Now, write your view.py
, and please make sure to add authentication as we have to work with users:
<span>from</span> <span>.models</span> <span>import</span> <span>Student</span><span>from</span> <span>.serializers</span> <span>import</span> <span>StudentModelSerializer</span><span>from</span> <span>rest_framework</span> <span>import</span> <span>viewsets</span><span>from</span> <span>rest_framework.permissions</span> <span>import</span> <span>IsAuthenticatedOrReadOnly</span><span>from</span> <span>rest_framework.authentication</span> <span>import</span> <span>SessionAuthentication</span><span>class</span> <span>StudentModelViewSet</span><span>(</span><span>viewsets</span><span>.</span><span>ModelViewSet</span><span>):</span><span>queryset</span> <span>=</span> <span>Student</span><span>.</span><span>objects</span><span>.</span><span>all</span><span>()</span><span>serializer_class</span> <span>=</span> <span>StudentModelSerializer</span><span>authentication_classes</span> <span>=</span> <span>[</span><span>SessionAuthentication</span><span>]</span><span>permission_classes</span> <span>=</span> <span>[</span><span>IsAuthenticatedOrReadOnly</span><span>]</span><span>def</span> <span>perform_create</span><span>(</span><span>self</span><span>,</span> <span>serializer</span><span>):</span><span>serializer</span><span>.</span><span>save</span><span>(</span><span>created_by</span><span>=</span><span>self</span><span>.</span><span>request</span><span>.</span><span>user</span><span>)</span><span>def</span> <span>perform_update</span><span>(</span><span>self</span><span>,</span> <span>serializer</span><span>):</span><span>serializer</span><span>.</span><span>save</span><span>(</span><span>updated_by</span><span>=</span><span>self</span><span>.</span><span>request</span><span>.</span><span>user</span><span>)</span><span>from</span> <span>.models</span> <span>import</span> <span>Student</span> <span>from</span> <span>.serializers</span> <span>import</span> <span>StudentModelSerializer</span> <span>from</span> <span>rest_framework</span> <span>import</span> <span>viewsets</span> <span>from</span> <span>rest_framework.permissions</span> <span>import</span> <span>IsAuthenticatedOrReadOnly</span> <span>from</span> <span>rest_framework.authentication</span> <span>import</span> <span>SessionAuthentication</span> <span>class</span> <span>StudentModelViewSet</span><span>(</span><span>viewsets</span><span>.</span><span>ModelViewSet</span><span>):</span> <span>queryset</span> <span>=</span> <span>Student</span><span>.</span><span>objects</span><span>.</span><span>all</span><span>()</span> <span>serializer_class</span> <span>=</span> <span>StudentModelSerializer</span> <span>authentication_classes</span> <span>=</span> <span>[</span><span>SessionAuthentication</span><span>]</span> <span>permission_classes</span> <span>=</span> <span>[</span><span>IsAuthenticatedOrReadOnly</span><span>]</span> <span>def</span> <span>perform_create</span><span>(</span><span>self</span><span>,</span> <span>serializer</span><span>):</span> <span>serializer</span><span>.</span><span>save</span><span>(</span><span>created_by</span><span>=</span><span>self</span><span>.</span><span>request</span><span>.</span><span>user</span><span>)</span> <span>def</span> <span>perform_update</span><span>(</span><span>self</span><span>,</span> <span>serializer</span><span>):</span> <span>serializer</span><span>.</span><span>save</span><span>(</span><span>updated_by</span><span>=</span><span>self</span><span>.</span><span>request</span><span>.</span><span>user</span><span>)</span>from .models import Student from .serializers import StudentModelSerializer from rest_framework import viewsets from rest_framework.permissions import IsAuthenticatedOrReadOnly from rest_framework.authentication import SessionAuthentication class StudentModelViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer authentication_classes = [SessionAuthentication] permission_classes = [IsAuthenticatedOrReadOnly] def perform_create(self, serializer): serializer.save(created_by=self.request.user) def perform_update(self, serializer): serializer.save(updated_by=self.request.user)
Enter fullscreen mode Exit fullscreen mode
URLs:
If you didn’t define URLs for your views, then define it in urls.py
.
<span>from</span> <span>django.contrib</span> <span>import</span> <span>admin</span><span>from</span> <span>django.urls</span> <span>import</span> <span>path</span><span>,</span> <span>include</span><span>from</span> <span>rest_framework.routers</span> <span>import</span> <span>DefaultRouter</span><span>from</span> <span>api.views</span> <span>import</span> <span>*</span><span># Create Router Object </span><span>router</span> <span>=</span> <span>DefaultRouter</span><span>()</span><span># Register View Class with Router </span><span>router</span><span>.</span><span>register</span><span>(</span><span>'</span><span>student</span><span>'</span><span>,</span> <span>StudentModelViewSet</span><span>,</span> <span>basename</span><span>=</span><span>'</span><span>student_</span><span>'</span><span>)</span><span>urlpatterns</span> <span>=</span> <span>[</span><span>path</span><span>(</span><span>'</span><span>admin/</span><span>'</span><span>,</span> <span>admin</span><span>.</span><span>site</span><span>.</span><span>urls</span><span>),</span><span>path</span><span>(</span><span>'</span><span>api/</span><span>'</span><span>,</span> <span>include</span><span>(</span><span>router</span><span>.</span><span>urls</span><span>)),</span><span>path</span><span>(</span><span>'</span><span>auth/</span><span>'</span><span>,</span> <span>include</span><span>(</span><span>'</span><span>rest_framework.urls</span><span>'</span><span>,</span> <span>namespace</span><span>=</span><span>'</span><span>rest_framework</span><span>'</span><span>))</span><span>]</span><span>from</span> <span>django.contrib</span> <span>import</span> <span>admin</span> <span>from</span> <span>django.urls</span> <span>import</span> <span>path</span><span>,</span> <span>include</span> <span>from</span> <span>rest_framework.routers</span> <span>import</span> <span>DefaultRouter</span> <span>from</span> <span>api.views</span> <span>import</span> <span>*</span> <span># Create Router Object </span><span>router</span> <span>=</span> <span>DefaultRouter</span><span>()</span> <span># Register View Class with Router </span><span>router</span><span>.</span><span>register</span><span>(</span><span>'</span><span>student</span><span>'</span><span>,</span> <span>StudentModelViewSet</span><span>,</span> <span>basename</span><span>=</span><span>'</span><span>student_</span><span>'</span><span>)</span> <span>urlpatterns</span> <span>=</span> <span>[</span> <span>path</span><span>(</span><span>'</span><span>admin/</span><span>'</span><span>,</span> <span>admin</span><span>.</span><span>site</span><span>.</span><span>urls</span><span>),</span> <span>path</span><span>(</span><span>'</span><span>api/</span><span>'</span><span>,</span> <span>include</span><span>(</span><span>router</span><span>.</span><span>urls</span><span>)),</span> <span>path</span><span>(</span><span>'</span><span>auth/</span><span>'</span><span>,</span> <span>include</span><span>(</span><span>'</span><span>rest_framework.urls</span><span>'</span><span>,</span> <span>namespace</span><span>=</span><span>'</span><span>rest_framework</span><span>'</span><span>))</span> <span>]</span>from django.contrib import admin from django.urls import path, include from rest_framework.routers import DefaultRouter from api.views import * # Create Router Object router = DefaultRouter() # Register View Class with Router router.register('student', StudentModelViewSet, basename='student_') urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), path('auth/', include('rest_framework.urls', namespace='rest_framework')) ]
Enter fullscreen mode Exit fullscreen mode
Make Migrations:
Migration is necessary after changes in models.
run –
python manage.py makemigrationspython manage.py migratepython manage.py makemigrations python manage.py migratepython manage.py makemigrations python manage.py migrate
Enter fullscreen mode Exit fullscreen mode
Users:
So this is what we are working for; to add a logged-in user automatically, you must have users registered in your system. So if you don’t have any registered users, then add some. If you are using the Django default system, then you can manage users from the Django admin panel.
It’s time to see the outcomes.
Go to the URL in browser:
Login to a user:
Add a new data:
Look at the data, automatically added logged user info to created_by
field:
Now update a data:
Look at the data, automatically added logged user info to updated_by
field:
暂无评论内容