Автоматическое добавление пользователей в другой класс после авторизации и как избежать проблем после изменения имен полей в старых данных

Я использую стандартный django.contrib.auth.models User. И у меня есть несколько зарегистрированных пользователей. Я хочу создать class Member:

class Member(models.Model):
    id_user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="ninja")

И хочу связать новых пользователей с class Member автоматически. У меня есть несколько вопросов.

  1. Как я могу связать классы автоматически после авторизации?
  2. Как я могу изменить поле из другого класса, например class Goal, где я использую сейчас id_user, но после создания нового class Member мне нужно изменить имя поля, например id_member. То есть старые данные имеют старое имя поля - id_user, но после изменения мне нужно дать новое имя id_member.
  3. Я нашел решение, как избежать этих двух вопросов. Как на моем рисунке: enter image description here

Я оставляю все как есть. Я не трогаю старые данные. Нет необходимости создавать автоматические связи между классами User и Member. Но мне все равно приходится вручную добавлять пользователей в класс Member. А в этой двойной связи я сомневаюсь

Конечно, я хочу знать ответы на все свои вопросы. Пожалуйста, если Вас не затруднит, развейте мои сомнения.

Я сам отвечаю на свои вопросы.

  1. Я использовал сигналы:

app/signals.py. Вам необходимо создать этот файл вручную в вашем проекте:

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.exceptions import ObjectDoesNotExist
from accounts.models import Member

@receiver(post_save, sender=User)
def create_ninja(sender, instance, created, **kwargs):
    if created:
        Member.objects.create(id_user=instance)

@receiver(post_save, sender=User)
def save_member(sender, instance, **kwargs):
    try:
        instance.member.save()
     except ObjectDoesNotExist:
        Member.objects.create(id_user=instance)

В вашем apps.py. я только что написал def ready(self):

from django.apps import AppConfig

class AccountsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'accounts'

    def ready(self):
        import accounts.signals

__init__.py:
default_app_config = 'accounts.apps.AccountsConfig'
  1. В этом случае я раскомментировал и закомментировал поле с foreignkey, которое относилось к моей новой модели. Иногда могут возникать проблемы. В этом случае вам нужно знать, как работают миграции, и, пожалуйста, не используйте migrate --fake, если вы не знаете, что произойдет.

  2. У меня пока не было проблем с двойными модельными ссылками. Так что сигналы работают для меня довольно хорошо.

Вернуться на верх