我是Django的新手。下面的代码是在为我的Blog应用程序注册新用户时创建用户个人资料。
怀疑:-为什么我们在最后的代码行中使用profile而不是Profile? 请注意大写的“个人资料”
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
答案 0 :(得分:2)
否,它不是内置功能。如果您定义模型中的关系(例如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
值是类的名称,但用小写字母 表示,并使用下划线(_
)作为单词分隔符。
这是根据PEP-8进行的,其中类的属性以小写形式编写,并使用下划线作为单词分隔符。
答案 1 :(得分:1)
我认为在您的代码中 个人资料是型号名称:
Class Profile(models.Model)
和个人资料是反向关系的related_name,例如:
class Profile(models.Model):
user= models.OneToOneField(User,on_delete=models.CASCADE,related_name="profile")
当您要使用模型的所有对象时使用:
Profile.objects.all()
以及需要用户对象时:
userobject.profile.<other fields name>