在 Django 默认用户模型上注册用户后,我想在 UserExtended 模型上创建一个条目。
这是 UserExtended 模型:
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()
但信号无法为新注册用户创建默认头像文件
我是新来的。请帮帮我。
答案 0 :(得分: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