如何改变Django和Oscar中的Fields

时间:2015-03-16 20:33:39

标签: python django django-oscar

我正在使用django-oscar制作一个Web应用程序,我想在合作伙伴模型中创建所需的用户字段。

我的第一个方法是覆盖"用户"合作伙伴模型中的字段,但后来我读到您cannot override Fields in Django

那么,如果我们无法覆盖奥斯卡,那么如何改变奥斯卡的一个领域呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

文档不是很清楚,但幸运的是,由于它的设计方式,这种模式的重写在奥斯卡得到了很好的支持。

但不是对oscar.apps.partner.Partner模型进行子类化并覆盖字段,而是需要创建自己的myproject.partner应用。

要注意的关键是奥斯卡的所有模型都是作为抽象模型实现的。然后奥斯卡检查你是否已经覆盖了任何框架应用程序,如果不是,奥斯卡将从其抽象的模型中定义一个具体的模型。如果你已经覆盖了一个框架应用程序,虽然它会首先尝试加载你的具体模型,然后回退到它自己的模型,你没有碰到过。

请参阅此处的文档:
https://django-oscar.readthedocs.org/en/releases-1.0/topics/customisation.html#fork-the-oscar-app

首先运行:

$ ./manage.py oscar_fork_app partner myproject/

将为您myproject.partner

创建被覆盖的应用的骨架

然后编辑您的设置:

# settings.py

from oscar import get_core_apps
# ...
INSTALLED_APPS = [
    # all your non-Oscar apps
] + get_core_apps(['myproject.partner'])

myproject/partner/models.py

from django.db import models

from oscar.apps.partner.abstract_models import AbstractPartner


class Partner(AbstractPartner):
    user = models.ForeignKey(...customised here...)


from oscar.apps.partner.models import *

由于您在底部导入了它们,因此partner.StockRecordpartner.StockAlert模型将像正常情况一样来自Oscar,但它会自动在任何地方使用您自定义的Partner模型。

如果您想使用Oscar使用的抽象类加载设备,您可以执行此操作(并确认您的覆盖正在运行):

In [1]: from oscar.core.loading import get_class

In [2]: Partner = get_class('partner.models', 'Partner')

In [3]: print Partner
<class 'myproject.partner.models.Partner'>

In [4]: StockAlert = get_class('partner.models', 'StockAlert')

In [5]: print StockAlert
<class 'oscar.apps.partner.models.StockAlert'>