【问题标题】:How to additional field to Django Oscar Order model?如何向 Django Oscar Order 模型添加字段?
【发布时间】:2019-06-20 05:12:18
【问题描述】:

我想在 Order 模型中添加额外的字段。我已经分叉了订单应用程序。 下面是在forked_app Order app的Order模型中添加的代码。

from django.utils import timezone
from oscar.apps.order.abstract_models import AbstractOrder
from oscar.apps.order.models import *  # noqa isort:skip
from django.db import models


class Order(AbstractOrder):
    status_update_time = models.CharField(max_length=30)

   def save(self, *args, **kwargs):
       self.status_update_time = timezone.now()
       super(Order, self).save(*args, **kwargs)

以下是我在迁移时遇到的错误。

class Order(AbstractOrder):
NameError: name 'AbstractOrder' is not defined
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f06737e6d08>


RuntimeError: Conflicting 'order' models in application 'order': <class 'oscar.apps.order.models.Order'> and <class 'forked_apps.order.models.Order'>.

【问题讨论】:

    标签: django django-models django-oscar


    【解决方案1】:
    from django.utils import timezone
    from oscar.apps.order.abstract_models import AbstractOrder
    
    from django.db import models
    
    
    class Order(AbstractOrder):
        status_update_time = models.CharField(max_length=30)
    
       def save(self, *args, **kwargs):
           self.status_update_time = timezone.now()
           super(Order, self).save(*args, **kwargs)
    

    models.py 文件末尾

    from oscar.apps.order.models import *  
    

    然后尝试做makemigrations 然后migrate

    【讨论】:

    • 我从 oscar.apps.order.models import BillingAddress, Order ImportError: cannot import name Order ` 得到了类似的东西
    • 我猜你必须在最后做import * 并保持另一个在顶部
    • 我在最后添加了from oscar.apps.order.models import *
    【解决方案2】:

    为了自定义模型、视图和 url,您需要 fork 模型/视图所在的 Oscar 核心应用。然后你应该能够覆盖任何模型/视图类。

    派生/自定义应用程序的步骤:

    1. 如果您是第一次分叉 Oscar 应用,那么您必须创建一个根应用文件夹,其中所有分叉的应用都将存在:

      $ mkdir yourapps 文件夹 $ touch yourappsfolder/init.py

    2. 创建一个与 Oscar 应用具有相同“app-label”的 python 模块:

    例如:自定义 oscar.apps.catalogue 应用

    $ mkdir yourappsfolder/catalogue
    $ touch yourappsfolder/catalogue/__init__.py
    
    1. 如果 Oscar 应用有 models.py,那么您必须在本地应用中创建一个 models.py 文件。

      您的自定义模型放在这里

      从 oscar.apps.catalogue.models 导入 *

    注意:要自定义 Oscar 模型,您必须在导入 Oscar 模型之前添加自定义模型。然后,你的模型文件将在一个应用程序中有两个同名的模型,Django 只会使用第一个。

    例如:向产品模型添加活动字段:

    # yourappsfolder/catalogue/models.py
    from django.db import models
    from oscar.apps.catalogue.abstract_models import AbstractProduct
    class Product(AbstractProduct):
        active = models.BooleanField(default=False)
    from oscar.apps.catalogue.models import *
    
    1. 在您的本地应用程序中创建一个“admin.py”文件。

      yourappsfolder/catalogue/admin.py

      从 oscar.apps.catalogue.admin 导入 *

    2. 然后从 oscar/apps/catalogue 复制“迁移”目录并将其放入新的本地目录应用程序中。

    3. 通过在 INSTALLED_APPS 中将 Oscar 的应用替换为您自己的应用,将其添加为 Django 应用。

      settings.py

      从奥斯卡导入 get_core_apps 安装应用程序 = [ ..., # 你所有的非奥斯卡应用 ] + get_core_apps(['yourappsfolder.catalogue'])

    注意:get_core_apps([]) 将返回 Oscar 核心应用列表,否则如果您提供自定义应用列表,它们将替换 Oscar 核心应用。

    1. 最后,使用“makemigrations”管理命令创建迁移,并使用“migrate catalogue”管理命令应用迁移。然后,您可以看到产品模型中添加了一个新列。

    【讨论】:

    • get_core_apps?现在这不是奥斯卡的一部分。你能重写你的解决方案吗?
    猜你喜欢
    • 2016-11-09
    • 2020-01-28
    • 2020-09-10
    • 1970-01-01
    • 2012-06-05
    • 2010-10-24
    • 1970-01-01
    • 2013-05-14
    • 2010-12-25
    相关资源
    最近更新 更多