【问题标题】:How to alter Fields in Django and Oscar如何在 Django 和 Oscar 中更改字段
【发布时间】:2015-05-19 03:12:45
【问题描述】:

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

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

那么,如果我们不能覆盖 Oscar 中的一个字段,如何修改它呢?

谢谢!

【问题讨论】:

    标签: python django django-oscar


    【解决方案1】:

    文档不是很清楚,但幸运的是这种模型覆盖在 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.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'>
    

    【讨论】:

    • 感谢您的回复!我按照您的指示分叉了oscar.apps.partner.Partner 应用程序,并收到错误消息django.core.exceptions.FieldError: Local field 'users' in class 'Partner' clashes with field of similar name from base class 'AbstractPartner' 这是否意味着在读取我的分叉合作伙伴模型之前,抽象合作伙伴模型正在构建到具体模型中?
    • 不幸的是,即使对于抽象模型,Django 也不允许这样做,因此除了上述之外,您还必须从 AbstractPartner 模型复制和粘贴,而不是从它继承。不过,您需要对 users 字段进行哪些更改?
    • 嗯……这就是我所担心的。我想要求所有合作伙伴都链接到一个用户。
    • 在这种情况下...因为它是一个 M2M,null=True attr 被忽略,blank=True 在 db 模式级别上没有任何意义,这些 attrs 只是通知 Django 模型验证(python)。 .. 在这种情况下,您可能可以在模型 __init__ 方法中做一些事情来设置这些属性并告诉 Django 按需要处理该字段
    猜你喜欢
    • 2019-07-02
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2021-11-27
    • 2014-01-09
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多