How do I implement Django custom user model without breaking existing code?

Answered
Aug 30, 2025 700 views 3 answers
20

I'm working on a Django project and encountering an issue with Django models. Here's my current implementation:


# models.py
from django.db import models

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()
    
# Signal handler
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

The specific error I'm getting is: "django.core.exceptions.ValidationError: Enter a valid email address"

I've already tried the following approaches:

  • Checked Django documentation and Stack Overflow
  • Verified my database schema and migrations
  • Added debugging prints to trace the issue
  • Tested with different data inputs

Environment details:

  • Django version: 5.0.1
  • Python version: 3.11.0
  • Database: PostgreSQL 15
  • Operating system: Ubuntu 22.04

Has anyone encountered this before? Any guidance would be greatly appreciated!

S
Asked by sarah_tech
Newbie 45 rep

3 Answers

12

The choice between Django signals and overriding save() depends on your use case:

Use save() method when:

  • The logic is directly related to the model
  • You need to modify the instance before saving
  • The operation is essential for data integrity
class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

Use signals when:

  • You need decoupled logic
  • Multiple models need the same behavior
  • You're working with third-party models
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
J
Answered by john_doe 1 week, 4 days ago
Bronze 50 rep

Comments

joseph: This decorator pattern is exactly what I needed for my Django middleware. Much appreciated! 1 week, 4 days ago

20

Here's a comprehensive approach to implementing JWT authentication in Django REST Framework:

# settings.py
INSTALLED_APPS = [
    'rest_framework',
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

from datetime import timedelta
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': True,
}
# urls.py
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view()),
    path('api/token/refresh/', TokenRefreshView.as_view()),
]
# Custom serializer for additional user data
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)
        token['username'] = user.username
        token['email'] = user.email
        return token
L
Answered by lisa_data 1 week, 4 days ago
Bronze 50 rep

Comments

abdullah: Excellent solution! This fixed my Django N+1 query problem immediately. Performance improved by 80%. 1 week, 4 days ago

abaditaye: What about handling this in a Docker containerized environment? Any special considerations? 1 week, 4 days ago

3

Here's how to optimize Python code performance using profiling tools:

1. Use cProfile for function-level profiling:

import cProfile
import pstats

# Profile your code
cProfile.run('your_function()', 'profile_output.prof')

# Analyze results
stats = pstats.Stats('profile_output.prof')
stats.sort_stats('cumulative')
stats.print_stats(10)  # Top 10 functions

2. Use line_profiler for line-by-line analysis:

# Install: pip install line_profiler
# Add @profile decorator to functions
@profile
def slow_function():
    # Your code here
    pass

# Run: kernprof -l -v script.py

3. Memory profiling with memory_profiler:

# Install: pip install memory_profiler
from memory_profiler import profile

@profile
def memory_intensive_function():
    # Your code here
    pass

# Run: python -m memory_profiler script.py

4. Use timeit for micro-benchmarks:

import timeit

# Compare different approaches
time1 = timeit.timeit('sum([1,2,3,4,5])', number=100000)
time2 = timeit.timeit('sum((1,2,3,4,5))', number=100000)
print(f'List: {time1}, Tuple: {time2}')
J
Answered by james_ml 1 week, 4 days ago
Bronze 90 rep

Comments

abdullah: This threading vs multiprocessing explanation cleared up my confusion. Saved me hours of debugging! 1 week, 4 days ago

Your Answer

You need to be logged in to answer questions.

Log In to Answer