【问题标题】:django-oscar multiple custom productsdjango-oscar 多种定制产品
【发布时间】:2018-04-08 18:16:35
【问题描述】:

有没有办法用 django-oscar 添加多个自定义产品?

在文档部分 How to customise models 中,显示了向产品模型添加单个字段。

但是,例如,如果我有两种不同的产品 DVD 和书籍。 DVD 将具有字段 director 和 length,而 books 将具有字段 Author 和 pages。如果我想在数据库中分类型。我该怎么做呢?

文档说

您应该像上面那样从 AbstractProduct 继承以更改所有产品的行为。进一步的子类化不是 推荐,因为使用具体的方法和属性 Product 的子类不可用,除非明确转换为 那堂课。要对不同类别的产品进行建模,请使用 ProductClass 和 ProductAttribute 代替。

但我没有看到如何做到这一点的示例。

【问题讨论】:

  • 当您可以通过简单地创建不同的ProductClasses 来实现您的建议时,为什么还要为您的产品定制一个“类”?请参阅how to model your catalogue 的文档。
  • 这是一个要求。我无法将属性保存到属性表中。我需要为我拥有的每个产品创建一个包含该产品属性的数据库表

标签: django-oscar


【解决方案1】:

我对您的任何想法(每种产品类型的表格)都不满意,因为 Oscar 不推荐这种方式,并且在展示/处理需要您更改/自定义大量功能的此类产品时可能会出错.

如果您真的想要访问产品类型类(如 DVDBook),那么我建议您首先通过迁移添加(此类产品类型的)产品,然后创建实际访问的实用程序类ProductClass.

例如

迁移

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import sys
from csv import DictReader
from django.db import migrations
from oscar.core.loading import get_model


def create_products_castrol(app, schema_editor):
    ProductAttribute = get_model('catalogue', 'ProductAttribute')
    ProductCategory = get_model('catalogue', 'ProductCategory')
    ProductClass = get_model('catalogue', 'ProductClass')
    StockRecord = get_model('partner', 'StockRecord')
    Category = get_model('catalogue', 'Category')
    Product = get_model('catalogue', 'Product')
    Partner = get_model('partner', 'Partner')

    partner = Partner.objects.get(name='Default Partner')

    # Create product class for Books
    product_class = ProductClass.objects.create(
        name='Books',
        requires_shipping=False,
        track_stock=False
    )
    print("Created product class -", product_class)

    # Add necessary class attributes
    author_attr = ProductAttribute.objects.create(
        product_class=product_class,
        name='Author',
        code='author',
        type=ProductAttribute.TEXT,
        required=True
    )
    print("Created product attribute -", author_attr)

    # Create products
    with open('/app/data/raw/products.csv') as csvfile:
        products = list(DictReader(csvfile))
    for product in products:
        print('Creating product -', product['title'])
        product_category = Category.objects.filter(name=product['category'])
        pr = Product.objects.create(
            structure=Product.STANDALONE,
            upc=product['upc'],
            title=product['title'],
            description=product['description'],
            product_class=product_class
        )
        print('\tCreated product')
        # Categories
        ProductCategory.objects.create(
            category=product_category[0],
            product=pr
        )
        print('\tAdded category -', product_category[0])
        # Attributes
        if product.get('author'):
            author_attr.save_value(pr, product['author'])
        print('\tAdded attribute values')
        # Stock
        StockRecord.objects.create(
            product=pr,
            partner=partner,
            partner_sku=pr.upc,
            price_excl_tax=product['retail_price'],
            price_retail=product['retail_price'],
            cost_price=product['cost_price']
        )
        print('\tAdded stock record')


def delete_products_castrol(app, schema_editor):
    ProductClass = get_model('catalogue', 'ProductClass')
    Product = get_model('catalogue', 'Product')

    with open('/app/data/raw/products.csv') as csvfile:
        products = list(DictReader(csvfile))

    for product in products:
        Product.objects.filter(upc=product['upc']).delete()

    product_class = ProductClass.objects.get(name='Books')
    product_class.delete()
    # everything else cascades nicely

    Attribute = get_model('catalogue', 'ProductAttribute')
    Attribute.objects.filter(code='title', product_class=product_class
                    ).delete()


class Migration(migrations.Migration):

    dependencies = [
        ('catalogue', '0001_initial'),
        ('partner', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(create_products,
                             reverse_code=delete_products),
    ]

您需要访问图书及其属性的代码

from oscar.core.loading import get_model

ProductClass = get_model('catalogue', 'ProductClass')

BooksClass = ProductClass.objects.get(name='Books')
books = BooksClass.products.all()

for book in books:
    print(book.attr.author)

就像author 一样,您可以添加各种其他属性。您可以添加各种类型的属性,请参阅source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 2015-02-19
    • 1970-01-01
    • 2017-02-22
    • 2015-07-12
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多