<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Buvaneshwaran </title>
    <description>The latest articles on Forem by Buvaneshwaran  (@buvanesh).</description>
    <link>https://forem.com/buvanesh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1451013%2F11aa1fcd-c80f-4a35-9efe-d8a223a10a66.jpg</url>
      <title>Forem: Buvaneshwaran </title>
      <link>https://forem.com/buvanesh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/buvanesh"/>
    <language>en</language>
    <item>
      <title>From Rails to Django: Bringing Rails Magic into Django Development (Part 1)</title>
      <dc:creator>Buvaneshwaran </dc:creator>
      <pubDate>Sun, 27 Apr 2025 15:12:07 +0000</pubDate>
      <link>https://forem.com/buvanesh/from-rails-to-django-bringing-rails-magic-into-django-development-part-1-24o8</link>
      <guid>https://forem.com/buvanesh/from-rails-to-django-bringing-rails-magic-into-django-development-part-1-24o8</guid>
      <description>&lt;p&gt;I’ve been working with Ruby on Rails for a long time, and honestly, it always felt like pure magic.&lt;/p&gt;

&lt;p&gt;Rails' elegance, its conventions, the way things just worked with minimal setup. It made development fast and enjoyable.&lt;/p&gt;

&lt;p&gt;Recently, I wanted to work with Django (Python’s popular web framework). Especially because of the growing interest in Python and AI.&lt;br&gt;
But when I started, I really missed the convenience and flow that Rails gave me.&lt;/p&gt;

&lt;p&gt;So, I started exploring:&lt;br&gt;
&lt;strong&gt;How can we get that Rails-like magic in Django too?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s take a look 👇&lt;/p&gt;
&lt;h2&gt;
  
  
  Serializers — Handling Data Representation
&lt;/h2&gt;

&lt;p&gt;In Rails, we use serializers to control how our model data looks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/serializers/post_serializer.rb
class PostSerializer &amp;lt; ActiveModel::Serializer
  attributes :id, :title, :content
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Django, it's similar using Django REST Framework:&lt;br&gt;
First, install the &lt;code&gt;djangorestframework&lt;/code&gt; package&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install djangorestframework&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'content']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And how to call those serializers?!. &lt;br&gt;
No worries, we going to see in upcoming.😎&lt;/p&gt;
&lt;h2&gt;
  
  
  Controllers and Views — Managing Requests
&lt;/h2&gt;

&lt;p&gt;In Rails, we use controllers like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# app/controllers/posts_controller.rb
class PostsController &amp;lt; ApplicationController
  def index
    @posts = Post.all
    render json: @posts
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Django, you can use &lt;strong&gt;ViewSets&lt;/strong&gt; to do the same:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# views.py
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Auto CRUD — no manual GET, POST, PUT handling! 😃&lt;/p&gt;

&lt;h2&gt;
  
  
  Routing — Clean and Automatic
&lt;/h2&gt;

&lt;p&gt;In Rails, adding routes is super simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# config/routes.rb
resources :posts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Django, you can achieve the same using &lt;strong&gt;DRF’s routers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# urls.py
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet, basename='post')

urlpatterns = router.urls

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resourceful routes with a few lines! ✌️&lt;/p&gt;

&lt;h2&gt;
  
  
  Callbacks — Hooking into Model Events
&lt;/h2&gt;

&lt;p&gt;In Rails&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Post &amp;lt; ApplicationRecord
  before_save :capitalize_title
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Django (with signals):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db.models.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save, sender=Post)
def capitalize_title(sender, instance, **kwargs):
    instance.title = instance.title.capitalize()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅Behavior before/after saving models — sorted!&lt;/p&gt;

&lt;h2&gt;
  
  
  Validations — Ensuring Data Integrity
&lt;/h2&gt;

&lt;p&gt;In Rails&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Post &amp;lt; ApplicationRecord
  validates :title, presence: true
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Django&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)

    def clean(self):
        if not self.title:
            raise ValidationError('Title cannot be empty')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Django models come with built-in validation hooks.&lt;br&gt;
(Also, Django’s CharField automatically validates max_length like Rails does!)&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Even though Rails and Django have different styles, you can recreate almost all of Rails' magic in Django — once you know where to look!&lt;/p&gt;

&lt;p&gt;From &lt;strong&gt;serializers, viewsets, routers, callbacks, validations&lt;/strong&gt;, and beyond — Django can feel just as developer-friendly as Rails.&lt;/p&gt;

&lt;p&gt;And this is just the beginning!&lt;/p&gt;

&lt;p&gt;In upcoming parts, we'll dive deeper into topics like building APIs, authentication, background jobs, and more.&lt;/p&gt;

&lt;p&gt;Stay tuned for Part 2! 🚀&lt;/p&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>django</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
