Как создать пользователя с автоматическими полями по умолчанию

#django #model

#django #Модель

Вопрос:

Я не уверен, как это сформулировать, но у меня есть User модель пользователя, заданная django.contrib.auth.models

Я могу зарегистрировать, войти в систему и выйти из системы пользователя, но теперь я хотел бы сделать немного больше.

Я хочу иметь кошелек, с которым пользователь связан при регистрации. До сих пор я создавал отдельное приложение, wallets и моя модель выглядит так…

 class Wallet(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    cash = models.FloatField(default=100, blank=True)
  

Идея заключается в том, что вместо расширения моего класса модели пользователя, чтобы иметь другое поле, поскольку я уже использую существующую модель пользователя, я делаю OneToOneField(User) так, чтобы пользователь был связан с кошельком, и этот кошелек содержит сумму наличных по умолчанию в 100 долларов

Когда я создаю пользователя, я хочу, чтобы кошелек был создан и также связан с этим пользователем. Как мне это сделать?

Ответ №1:

Вы можете реализовать post_save сигнал, который запускается при создании нового пользовательского объекта:

 # app/signals.py

from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_wallet(sender, instance, created, *args, **kwargs):
    if created:
        Wallet.objects.create(user=instance)  

Вам нужно загрузить signals модуль. Это можно сделать в AppConfig вашем приложении:

 # app/apps.py

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'app'

    def ready(self):
        import app.signals  

и вы настраиваете приложение в __init__.py файле:

 # app/__init__.py

default_app_config = 'app.apps.MyAppConfig'  

Конечно, вам нужно заменить app часть в файлах именем приложения Django.


Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете ознакомиться со ссылкой на User раздел модели документации.