Подтвердить что ты не робот

Создание экземпляра 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), когда он создан?

4b9b3361

Ответ 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)