在Django中扩展模型的正确方法

1 投票
2 回答
512 浏览
提问于 2025-04-18 07:45

在Django 1.5中,扩展第三方模型的最佳方法是什么?
假设我有一个第三方模型叫做Feedback:

class Feedback(models.Model):
    user = models.ForeignKey(
        'auth.User',
        verbose_name=_('User'),
        related_name='feedback_form_submissions',
        blank=True, null=True,
    )

    email = models.EmailField(
        verbose_name=_('Email'),
        blank=True,
    )
    ...

我有自己的用户类。我需要重写用户字段。邮箱字段我需要设置为不允许为空(blank=False),而且我还想在这个模型中添加另一个字段。这样做的最佳方法是什么?

2 个回答

1

你有没有看过这个帖子? 如何在Django的contrib.auth中的用户模型中使电子邮件字段唯一

我觉得它回答了你想知道的所有问题。

Django的文档里也有关于如何做到这一点的说明,链接在这里: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-user

你还可以为Django指定一个自定义用户模型,方法是设置 AUTH_USER_MODEL = 'myapp.MyUser'。然后你就可以添加你自己的字段了。

2

根据不同的情况,也就是你使用的第三方应用程序,你可以有多种方法来处理这个问题:

  1. 明确地从一个模型继承:

    比如你可以写一个类叫做 CustomFeedback,它继承自 Feedback:

    class CustomFeedback(Feedback):
    #等等

  2. 创建一个自定义应用:

    你可以通过运行 django-admin.py startapp AppName_custom 来扩展这个应用。这是我在一些应用中使用过的方法。在这种情况下,你会想要像上面那样继承一个类,但要拦截数据库的方法,比如 saveclean

  3. 分支这个应用。如果你对 Django 不太熟悉,这种方法可能是最难的。你只需通过 gitmercurial 克隆或分支,然后添加你需要的代码来修改应用的行为。

一般来说(请原谅我这么说),你不应该修改 User 模型,因为 Auth 模块已经很好地进行了分隔。相反,你应该使用像 django-profiles 这样的应用来向模型添加数据或扩展表单。

撰写回答