“个人资料”一词在Django中是内置功能吗?

时间:2019-05-24 11:48:32

标签: django django-signals

我是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

2 个答案:

答案 0 :(得分:2)

,它不是内置功能。如果您定义模型中的关系(例如ProfileUser),则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>