【问题标题】:In Django correct way of extending a model在 Django 中扩展模型的正确方法
【发布时间】:2014-05-27 20:21:49
【问题描述】:

在 django 1.5 中扩展第三方模型的最佳方法是什么?
假设我有名为反馈的第 3 方模型:

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,
    )
    ...

我有自己的用户类。我需要覆盖用户字段。电子邮件我需要设置空白=假,并且可能想在模型中添加另一个字段。最好的方法是什么?

【问题讨论】:

  • 不幸的是,他们应该使用正确的约定来创建支持自定义用户模型的应用程序(使用 AUTH_USER_MODEL),这可能是最简单和最干净的分叉项目并进行正确更新

标签: python django django-models


【解决方案1】:

根据具体情况,即您使用的是哪个 3rd 方应用,您可以通过多种方式来解决此问题:

  1. 从模型继承的显式性:

    类CustomFeedback(反馈): #等

  2. 创建自定义应用程序: 通过执行django-admin.py startapp AppName_custom 扩展应用程序,这是我在某些应用程序中使用的技术。在这种情况下,您将希望从上述类中继承,但拦截 saveclean 等 DB 方法。

  3. 分叉应用程序。如果您对 Django 没有经验,这很容易成为最困难的方法。只需通过gitmercurial 克隆或分叉,然后添加您需要修改应用行为的任何代码。

根据经验(请原谅表达式),您不应该修改User 模型,因为Auth 模块被很好地划分了。相反,您应该使用django-profiles 之类的应用程序将数据添加到模型或扩展表单。

【讨论】:

  • 对不起,如果我通过继承类来扩展应用程序,我该如何更改用户字段? Django 明确禁止字段隐藏和覆盖docs.djangoproject.com/en/1.5/topics/db/models/…
  • 抱歉,我不确定我是否理解。如果您正在自定义表单,您可以将其排除在 fields 属性之外。如果您尝试自己修改模型字段,我会考虑这会如何影响“不要重复自己”的原则。同样,我不确定我是否理解您的后续行动。
【解决方案2】:

你看过这篇文章吗? How to make email field unique in model User from contrib.auth in Django

我认为它可以满足您的所有需求。

Django 还包括有关如何在此处执行此操作的文档:https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-user

您还可以为 Django 指定自定义用户模型以与 AUTH_USER_MODEL = 'myapp.MyUser' 一起使用。您可以从那里设置自定义字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2023-04-01
    • 2022-01-16
    • 2021-11-30
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多