如何在Django Oscar Order模型中增加字段?

时间:2019-06-20 05:12:18

标签: django django-models django-oscar

我想向订单模型添加其他字段。我已经分叉了订单应用程序。 下面是在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'>.

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

为了自定义模型,视图和URL,您需要派生一个驻留有模型/视图的Oscar核心应用。然后,您应该可以覆盖任何模型/视图类。

创建/自定义应用程序的步骤:

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

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

  2. 使用与Oscar应用相同的“应用标签”创建一个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将仅使用第一个。

Ex:将活动字段添加到产品模型中:

# 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”文件。

    您的应用文件夹/目录/admin.py

    from oscar.apps.catalogue.admin import *

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

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

    settings.py

    从oscar导入get_core_apps INSTALLED_APPS = [     ...,     #您所有的非奥斯卡应用 ] + get_core_apps(['yourappsfolder.catalogue'])

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

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