如何创建 django-oscar 产品类作为数据迁移

Posted

技术标签:

【中文标题】如何创建 django-oscar 产品类作为数据迁移【英文标题】:How to create django-oscar product classes as data migration 【发布时间】:2021-05-22 17:43:43 【问题描述】:

Frobshop tutorial says:“对于部署设置,我们建议将产品类创建为 data migration。”

该链接指向一个高级且抽象的文档,该文档更具抱负而非指导性。在本教程的这一点上,尚未提供有关如何创建数据迁移的信息。谷歌搜索并搜索此信息似乎需要花费数小时才能弄清楚如何遵循建议。

作为数据迁移创建产品类的推荐方法是什么?

【问题讨论】:

【参考方案1】:

文档中链接到的文章已经很老了,并且已经被 Django 自己的数据迁移支持所取代,即documented here。

这些的 Django 文档很好地解释了它们是什么以及如何创建它们,因此假设您已经阅读过,那么这就是本教程中建议的内容:

    在您项目的一个应用中创建数据迁移:
python manage.py makemigrations --empty yourappname
    向此迁移添加一个函数,用于填充您要用于初始化数据库的任何产品类:
from django.db import migrations

def populate_product_classes(apps, schema_editor):
    ProductClass = apps.get_model('catalogue', 'ProductClass')
    
    books = ProductClass.objects.create(name='Books')
    toys = ProductClass.objects.create(name='Toys')
    # ... etc. You could also load data from a fixture here, 
    # and may also want to create attributes for each class as well, e.g., 
    ProductAttribute = apps.get_model('catalogue', 'ProductAttribute')
    ProductAttribute.objects.create(product_class=books, name='ISBN', code='isbn', type='text')


class Migration(migrations.Migration):

    dependencies = [
        ('catalogue', '0022_auto_20210210_0539'),   # This needs to be after Oscar's catalogue migrations
    ]

    operations = [
        migrations.RunPython(combine_names),
    ] 

创建后,在您的项目上执行 manage.py migrate 将运行此迁移并使用产品类/属性填充数据库。

【讨论】:

makemigrations --empty 的文档说“为指定的应用程序输出一个空迁移,用于手动编辑。这适用于高级用户,除非您熟悉迁移格式,否则不应使用迁移操作,以及迁移之间的依赖关系。”你能更详细地解释一下第 1 步的作用吗? 所以我的一个应用会为另一个应用的模型创建对象。 This SO answer 似乎更复杂。上述答案是否可能适用于@Rockallite 描述的场景? @MikeSlinn 抱歉,我目前没有足够的时间来彻底回答你的 cmets,除了重申 Django 文档所说的内容 - 你需要知道在创建时你在做什么你自己的迁移。这并不意味着这样做是不安全的——只是你需要了解它们是如何工作的。一般来说,Oscar 假设开发人员将对 Django 有相当扎实的了解,并且能够自如地利用 Django 的能力来调整其功能。

以上是关于如何创建 django-oscar 产品类作为数据迁移的主要内容,如果未能解决你的问题,请参考以下文章

抽象工厂和工厂方法

java之简单工厂

java设计模式 -------- 创建模式 之 抽象工厂模式

创造型设计模式-----工厂方法模式

设计模式工厂模式(创建型)

23种设计模式——简单工厂设计模式