Create OneToOne instance on model creation
I'm building my first django app. I have a user, and the user has a list of favourites. A user has exactly one list of favourites, and that list belongs exclusively to that user.
class User(models.Model):
name = models.CharField(max_length=200)
class FavouriteList(models.Model):
user = models.OneToOneField(User)
favourites = models.ManyToManyField(Favourite, blank=True)
When a new user is created, I want to e开发者_如何学Pythonnsure that the user has a FavouriteList
. I've looked around in the Django documentation and haven't had much luck.
Does anyone know how I can ensure that a model has a child object (e.g. FavouriteList
) when it is created?
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.
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.
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)
精彩评论