1

我正在使用 django-oscar 制作一个 Web 应用程序,并且我想在合作伙伴模型中设置用户字段。

我的第一种方法是覆盖 Partner 模型中的“用户”字段,但后来我读到您不能覆盖 Django 中的字段

那么,如果我们无法覆盖 Oscar 中的字段,如何更改它呢?

谢谢!

4

1 回答 1

3

文档不是很清楚,但幸运的是这种模型覆盖在 Oscar 中得到了很好的支持,这要归功于它的设计方式。

但是,oscar.apps.partner.Partner您不需要对模型进行子类化并覆盖您需要制作自己的myproject.partner应用程序的字段。

需要注意的关键是 Oscar 中的所有模型都实现为抽象模型。然后 Oscar 检查您是否覆盖了任何框架应用程序,如果没有,Oscar 将根据其抽象模型定义具体模型。如果您已经覆盖了框架应用程序,尽管它会首先尝试加载您的具体模型,然后为您未触及的任何模型回退到它自己的模型。

请参阅此处的文档:
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.StockRecord模型partner.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'>
于 2015-03-16T20:52:55.050 回答