我是django的新手。以下代码是在我的博客应用程序的新用户注册时创建一个用户配置文件。
怀疑: - 为什么在最后一个代码行中使用配置文件而不是配置文件?请注意大写的单词"配置文件"
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, *args,**kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, *args,**kwargs):
instance.profile.save()''' #last code line
no ,它不是内置功能。如果您定义了从模型(例如Profile
到User
(的关系,则Django会自动创建反向关系。您可以使用related_name
属性指定该关系的名称。
因此,您可以通过更改关系的 related_name
[django-doc],以不同的方式指定名称。例如:
from django.db import models
from django.contrib.auth import get_user_model
class Profile(models.Model):
user = models.OneToOneField(
get_user_model(),
on_delete=models.CASCADE,
related_name='other_attribute'
)
在这种情况下,个人资料的名称为:
from django.contrib.auth import get_user_model
@receiver(post_save, sender=get_user_model())
def save_profile(sender, instance, *args,**kwargs):
instance.other_attribute.save()
默认情况下, related_name
值是类的名称,但在 lowercase 中,并以下划线(_
(为单词分离器。
这是根据 pep-8 的依据
我认为在您的代码中配置文件是模型的名称:
Class Profile(models.Model)
和 profile 是相反关系的相关关系:
class Profile(models.Model):
user= models.OneToOneField(User,on_delete=models.CASCADE,related_name="profile")
当您想使用所有模型的对象时:
Profile.objects.all()
并且当您想要用户对象时:
userobject.profile.<other fields name>