【问题标题】:How to modify a Django model?如何修改 Django 模型?
【发布时间】:2016-02-04 10:11:00
【问题描述】:

如果我想改变,例如Django 的站点模块:

from django.contrib.sites.models import Site

我将如何在我的项目中做到这一点?我是子类化还是我该怎么做才能更改或添加一些代码?

或者我只是创建一个新模型?

【问题讨论】:

  • “修改”是什么意思?如果你需要扩展Site,子类化是一种方式。
  • 如果我在哪里更改 Django 模型中的现有字段。就像我在下面bakkal的回答中评论一样。
  • 事实上,你不能这样做:docs.djangoproject.com/es/1.9/topics/db/models/….
  • 您要么需要继承 Site,保留 name 字段并创建一个新字段(例如,custom_name),不使用第一个字段,要么创建您的从头开始拥有自己的模型。
  • 其实问题有答案here

标签: python django django-models


【解决方案1】:

您可以通过继承添加字段

如果您仍然需要保留对原始站点对象/行的引用,您可以使用multi-table inheritance

from django.contrib.sites.models import Site

class MySite(Site):
    new_field = models.CharField(...)

    def new_method(self):
        # do something new

这允许您拥有常规的 Site 对象,这些对象可以由您的 MySite 模型扩展,在这种情况下,您可以例如通过site.mysite 访问额外的字段和方法,例如site.mysite.new_field.

通过模型继承,您无法更改祖先字段

通过继承你不能隐藏祖先字段,因为Django will raise a FieldError if you override any model field in any ancestor model

我不会为此冒险编写自定义数据库迁移,因为如果您更新 Django,您可能会遇到与站点模型的架构冲突。

如果我想存储祖先模型允许的更多信息,我会这样做:

class SiteLongName(Site):
    long_name = models.CharField(max_length=60)

【讨论】:

  • 好吧,这很不错。虽然我仍然想知道是否需要更改 Site 模型中当前的字段:name = models.CharField(_('display name'), max_length=50) 来更改 max_length=60。我怎么做?只需要在新的多表继承中再添加一次?
猜你喜欢
  • 1970-01-01
  • 2014-01-11
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多