Создание экземпляра OneToOne при создании модели
Я создаю свое первое приложение django. У меня есть пользователь, и у пользователя есть список избранных. Пользователь имеет только один список избранных, и этот список принадлежит исключительно этому пользователю.
class User(models.Model):
name = models.CharField(max_length=200)
class FavouriteList(models.Model):
user = models.OneToOneField(User)
favourites = models.ManyToManyField(Favourite, blank=True)
Когда создается новый пользователь, я хочу убедиться, что у пользователя есть FavouriteList
. Я просмотрел документацию Django и не имел большой удачи.
Кто-нибудь знает, как я могу гарантировать, что у модели есть дочерний объект (например, FavouriteList
), когда он создан?
Ответы
Ответ 1
Самый распространенный способ добиться этого - использовать систему сигналов Django. Вы можете прикрепить обработчик сигнала (только функцию) к сигналу post_save для модели пользователя и создать свой список избранного внутри этого обратного вызова.
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)
Выше было адаптировано из Django docs. Обязательно прочитайте документы сигналов полностью, потому что есть несколько проблем, которые могут уловить вас, например, где должен работать ваш код обработчика сигнала и как избежать дублирования обработчиков.
Ответ 2
Отличный django-annoying плагин решает это для вас с AutoOneToOneField
. Я использую его для профилей пользователей во всех проектах django, над которыми я работаю.
Ответ 3
Один из способов - зарегистрировать сигнал post_save со следующим обработчиком:
def user_save(sender, instance, created, **kwargs):
if created:
FavouriteList.objects.get_or_create(user=instance)