在Django中扩展模型的正确方法
在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 个回答
你有没有看过这个帖子? 如何在Django的contrib.auth中的用户模型中使电子邮件字段唯一
我觉得它回答了你想知道的所有问题。
Django的文档里也有关于如何做到这一点的说明,链接在这里: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-user
你还可以为Django指定一个自定义用户模型,方法是设置 AUTH_USER_MODEL = 'myapp.MyUser'。然后你就可以添加你自己的字段了。
根据不同的情况,也就是你使用的第三方应用程序,你可以有多种方法来处理这个问题:
明确地从一个模型继承:
比如你可以写一个类叫做 CustomFeedback,它继承自 Feedback:
class CustomFeedback(Feedback):
#等等创建一个自定义应用:
你可以通过运行
django-admin.py startapp AppName_custom
来扩展这个应用。这是我在一些应用中使用过的方法。在这种情况下,你会想要像上面那样继承一个类,但要拦截数据库的方法,比如save
或clean
。分支这个应用。如果你对 Django 不太熟悉,这种方法可能是最难的。你只需通过
git
或mercurial
克隆或分支,然后添加你需要的代码来修改应用的行为。
一般来说(请原谅我这么说),你不应该修改 User
模型,因为 Auth
模块已经很好地进行了分隔。相反,你应该使用像 django-profiles
这样的应用来向模型添加数据或扩展表单。