【问题标题】:How to link an existing model with user model in Django如何在 Django 中将现有模型与用户模型链接
【发布时间】:2021-05-16 18:32:08
【问题描述】:

我认为这是一个非常简单的问题,但我是 Django 新手,正在寻找最佳/正确的做事方式。如果我问了愚蠢的问题,请原谅我。

我的 Django 应用中有一个名为 Person 的模型。它仅包含一个人的基本信息,尚未涉及个人数据:

class Person(models.Model):

    birthday = models.DateField(null=True)

    gender = models.CharField(max_length=10)

    height = models.CharField(max_length=3)

    weight = models.CharField(max_length=3)

现在我还想为该人添加一个注册和登录功能。正确的方法是什么?许多教程似乎建议使用forms.py 文件,例如:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class RegisterForm(UserCreationForm):
    birthdate = forms.DateField()
    discord_id = forms.CharField(max_length=100, help_text='Discord ID')
    zoom_id = forms.CharField(max_length=100, help_text='Zoom ID')

    class Meta:
        model = User
        fields = ["username", "password1", "password2", "birthdate", "email", "discord_id", "zoom_id"]

如何使用/链接我现有的 Person 模型与这个内置的 User 模型?或者我是否需要Models.py 中的单独模型?我是否只是在forms.py 中创建像上面一样的用户模型并将我的自定义字段添加到其中?

【问题讨论】:

    标签: python django model


    【解决方案1】:

    您可以参考 django 文档扩展用户模型:

    https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#extending-the-existing-user-model

    有两种方法。您可以将模型与 django 用户模型建立 OneToOne 关系以添加其他字段。或者您可以从 django 扩展抽象用户模型来创建自定义用户。

    from django.contrib.auth.models import AbstractUser
    
        class Person(AbstractUser):
            birthday = models.DateField(null=True)
    
            gender = models.CharField(max_length=10)
    
            height = models.CharField(max_length=3)
    
            weight = models.CharField(max_length=3)
    

    您还需要在设置中标记自定义用户:

    AUTH_USER_MODEL = 'myapp.Person'
    

    那么该模型可以以如下形式使用:

    from django.contrib.auth.forms import UserCreationForm
    from .models import Person
    
    class RegisterForm(UserCreationForm):
        birthdate = forms.DateField()
        discord_id = forms.CharField(max_length=100, help_text='Discord ID')
        zoom_id = forms.CharField(max_length=100, help_text='Zoom ID')
    
        class Meta:
            model = Person
            fields = ["username", "password1", "password2", "birthdate", "email", "discord_id", "zoom_id"]
    

    或者你可以做 OneToOne 关系:

    from django.contrib.auth.models import User
    
    class Person(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
    
        birthday = models.DateField(null=True)
    
        gender = models.CharField(max_length=10)
    
        height = models.CharField(max_length=3)
    
        weight = models.CharField(max_length=3)
    

    【讨论】:

    • 谢谢。我有一个与您的回答相关的问题:OneToOne -relation 和 ForeignKey 有什么区别?将我的 Person 模型链接到我的 CustomUser 模型时,我可以在这里使用 ForeignKey 吗?或者它是否需要是 OneToOne 关系?
    • OneToOne 关系意味着每个用户都有一个且只有一个相关的人员或个人资料。用户的外键意味着单个用户可以拥有多个个人资料。这取决于您的要求。
    【解决方案2】:

    有多种方法可以扩展用户模型以根据您的要求添加更多自定义字段。它们是代理管理器、OneToOneField、AbstractUser。 我的选择是使用一对一的关系字段,因为它将用户绑定到只有一个配置文件。

    from django.contrib.auth.models import User
    
    class foo(models.Model):
       user = OneToOneField(User, on_delete=models.CASCADE)
    

    此外,您需要有 django 信号才能将扩展的 foo 模型与 User 模型绑定。这样无论对 foo 进行什么更改,用户都可以听到它。

    from django.db.models.signals import post_save
    from django.dispatch import reciever
    
    @reciever(sender=User, post_save)
    def create_foo(sender, instance, created, **kwargs):
       if created:
          foo.objects.create(user=instance)
    
    @reciever(sender=User, post_save)
    def save_foo(sender, instance, **kwargs):
       instance.foo.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2018-06-17
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      相关资源
      最近更新 更多