#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
раздел модели документации.