有没有一种方法可以用django-oscar添加多个自定义产品?
在文档部分如何定制模型中,向产品模型添加了一个字段。
但是,例如,如果我有两个不同的产品DVD和图书。DVD有字段、导演和长度,书籍有字段、作者和页面。如果我想在数据库中分类型。我该怎么做呢?
文件上说
您应该像上面一样从AbstractProduct继承来改变所有产品的行为。不建议进一步子类化,因为除非显式地对该类进行强制转换,否则不能使用Product具体子类的方法和属性。要对不同类别的产品进行建模,请使用ProductClass和ProductAttribute。
但我看不出如何做到这一点的例子。
发布于 2018-04-11 10:27:56
我对您的任何想法(每种产品类型的表)都不满意,因为Oscar不推荐这样做,而且在显示/处理这类需要您更改/自定义大量功能的产品时,可能会出错。
如果您确实希望访问产品类型类(如DVD、Book),那么我建议您首先通过迁移添加(此类产品类型的产品),然后创建实际访问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一样,您可以添加各种其他属性。您可以添加各种类型的属性,请参阅来源。
https://stackoverflow.com/questions/49721168
复制相似问题