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

#django #django-rest-framework #django-3.2

Вопрос:

Я хочу создать запись в модели, поддерживаемой пользователем, после регистрации пользователя в модели пользователя по умолчанию Django.

вот модель, предложенная пользователем:

 class UserExtended(models.Model):
    extended_id = models.AutoField(primary_key=True, editable=False)
    avatar = models.ImageField(null=True, blank=True, default='Capture.PNG')
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
 

вот функция просмотра, которая регистрирует пользователя

 @api_view(['POST'])
def register_user(request):
    data = request.data
    user = User.objects.create(
        first_name=data['name'],
        username=data['username'],
        email=data['email'],
        password=make_password(data['password'])
    )

    serializer = UserSerializerWithToken(user, many=False)
    return Response(serializer.data)

 

вот сериализатор

 class UserSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField(read_only=True)
    isAdmin = serializers.SerializerMethodField(read_only=True)
    avatar = serializers.SerializerMethodField()

    def get_avatar(self, obj):
        avatar = obj.userextended.avatar.url
        print(avatar)
        if avatar == '':
            avatar = 'null'
        return avatar

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'name', 'avatar', 'isAdmin']

    def get_name(self, obj):
        name = obj.first_name
        if name == '':
            name = obj.email
        return name

    def get_isAdmin(self, obj):
        return obj.is_staff


class UserSerializerWithToken(UserSerializer):
    token = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'name', 'isAdmin', 'token']
 

вот это signal.py:

 from django.db.models.signals import post_save, pre_delete
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import UserExtended


@receiver(post_save, sender=User)
def create_user_extended(sender, instance, created, **kwargs):
    if created:
        UserExtended.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_extended(sender, instance, **kwargs):
    instance.userextended.save()
 

но сигнал не работает для создания файла аватара по умолчанию для нового зарегистрированного пользователя

Я новенькая. Пожалуйста, помогите мне.

Комментарии:

1. Вы импортировали это signal.py в ready метод конфигурации приложения?

2. нет. как это сделать. Я никогда не использовал сигналы. Я разработчик mysql. но я не знаю, как использовать сигналы. Раньше я решал эту проблему в mysql с помощью триггеров

Ответ №1:

По умолчанию Django не ищет файл с именем signal.py и т. Д. Следовательно, происходит то, что ваши сигналы никогда не регистрируются (на самом деле файл, в который вы их записываете, никогда не запускается). Общее решение для добавления сигналов состоит в том, чтобы записать их в отдельный файл, а затем импортировать / зарегистрировать их в ready методе конфигурации приложения.

В приложении, в котором вы пишете signal.py , должен быть файл apps.py , в котором должен быть класс, унаследованный от AppConfig редактирования этого класса, добавления ready в него метода и импорта ваших сигналов туда:

 from django.apps import AppConfig


# The parts marked as "Don't edit" mean to keep them as it already is in _your_ code and not copy it
class YourAppConfig(AppConfig): # Don't edit
    default_auto_field = 'django.db.models.BigAutoField'  # Don't edit
    name = 'your_app'  # Don't edit
    
    # Copy only the code below
    def ready(self):
        # models, signals etc. are imported only here because otherwise the models might not be loaded yet
        from . import signal
 

Комментарии:

1. Большое спасибо.!!