如何改变 Django 和 Oscar 中的字段
How to alter Fields in Django and Oscar
我正在使用 django-oscar 制作一个 web 应用程序,我想在合作伙伴模型中制作必需的用户字段。
我的第一个方法是覆盖合作伙伴模型中的 "user" 字段,但后来我读到你 cannot override Fields in Django。
那么,如果我们无法覆盖 Oscar 中的某个字段,该如何更改它呢?
谢谢!
文档不是很清楚,但幸运的是,由于其设计方式,这种模型覆盖在 Oscar 中得到了很好的支持。
但是,您需要制作自己的 myproject.partner
应用程序,而不是 class 子 oscar.apps.partner.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 使用的抽象 class 加载装置,您可以这样做(并确认您的覆盖正在工作):
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'>
我正在使用 django-oscar 制作一个 web 应用程序,我想在合作伙伴模型中制作必需的用户字段。
我的第一个方法是覆盖合作伙伴模型中的 "user" 字段,但后来我读到你 cannot override Fields in Django。
那么,如果我们无法覆盖 Oscar 中的某个字段,该如何更改它呢?
谢谢!
文档不是很清楚,但幸运的是,由于其设计方式,这种模型覆盖在 Oscar 中得到了很好的支持。
但是,您需要制作自己的 myproject.partner
应用程序,而不是 class 子 oscar.apps.partner.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 使用的抽象 class 加载装置,您可以这样做(并确认您的覆盖正在工作):
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'>