[Django]-Create OneToOne instance on model creation

46πŸ‘

βœ…

The most common way to accomplish this is to use the Django signals system. You can attach a signal handler (just a function somewhere) to the post_save signal for the User model, and create your favorites list inside of that callback.

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

@receiver(post_save, sender=User)
def create_favorites(sender, instance, created, **kwargs):
    if created:
        Favorites.objects.create(user=instance)

The above was adapted from the Django signals docs. Be sure to read the signals docs entirely because there are a few issues that can snag you such as where your signal handler code should live and how to avoid duplicate handlers.

πŸ‘€shadfc

8πŸ‘

An excellent django-annoying plugin solves this for you with AutoOneToOneField. I’m using it for user profiles in all django projects I work on.

5πŸ‘

One way would be to register a post_save signal with next handler:

def user_save(sender, instance, created, **kwargs):
  if created:
     FavouriteList.objects.get_or_create(user=instance)

1πŸ‘

You can override save method of User model.

def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
    is_new = self.pk is None  # check if object is new to be saved
    super().save(force_insert, force_update, using, update_fields)
    FavouriteList.objects.create(user=self) if is_new else None
πŸ‘€Ali Shekari

Leave a comment