在DjangoOscar中以编程方式创建规范的“父”产品

6yjfywim  于 2022-12-24  发布在  Go
关注(0)|答案(2)|浏览(165)

我尝试使用django-oscar import_oscar_catalogue类的修改版本从CSV导入一组产品,在第一次遇到产品(按标题定义)时,创建一个规范的父产品,然后在以后遇到该父产品时,在该父产品下创建一个子产品。
这看起来是可行的,但是规范产品并没有反映子产品的库存水平,也没有显示该产品的正确属性,但是它确实在django Jmeter 板中正确地将它们列为变体。
我如何通过编程方式在产品中使用正确的库存记录创建这种子/父关系?
相关代码:

def _create_item(self, upc, title, product_class, other_product_attributes):
    product_class, __ \
        = ProductClass.objects.get_or_create(name=product_class)
    try:
        parent = Product.objects.get(title=title)
        item = Product()
        item.parent = parent
    except Product.DoesNotExist:
        # Here is where I think it might need to be changed
        # Maybe pitem = ParentProduct() or something?
        pitem = Product()
        pitem.upc = upc
        pitem.title = title
        pitem.other_product_attributes = other_product_attributes
        # Here parent item is saved to db
        pitem.save()
        # Create item because no parent was found
        item = Product()
        parent = Product.objects.get(title=title)
        #Set parent
        item.parent = parent
    # Customize child attributes
    item.product_class = product_class
    item.title = title
    item.other_product_attributes = other_product_attributes
    # Save the child item
    item.save()

def _create_stockrecord(self, item, partner_name, partner_sku, price_excl_tax,
    num_in_stock, stats):
    # Create partner and stock record
    partner, _ = Partner.objects.get_or_create(
        name=partner_name)
    try:
        stock = StockRecord.objects.get(partner_sku=partner_sku)
    except StockRecord.DoesNotExist:
        stock = StockRecord()
        stock.num_in_stock = 0
    # General attributes
    stock.product = item
    stock.partner = partner
    # SKU will be unique for every object
    stock.partner_sku = partner_sku
    stock.price_excl_tax = D(price_excl_tax)
    stock.num_in_stock += int(num_in_stock)
    # Save the object to database
    stock.save()

create_stockrecord()为每个唯一的项目变体创建一个库存记录,但这些变体的库存记录不会转换到父项目。

**EDIT:**我已经用一个方法更新了这个类,这个方法可以针对ProductClass示例显式调用ProductClass.objects.track_stock(),并且我在遍历CSV文件的所有行之后调用它(将我当前使用的一个产品类的名称传递给它)。但是,当在 Jmeter 板中查看库存时,没有一个子库存/变体库存被计入父库存。

def track_stock(self, class_name):
    self.logger.info("ProductClass name: %s" % class_name)
    product_class = ProductClass.objects.get_or_create(name=class_name)
    self.logger.info("ProductClass: %s" % str(product_class))
    self.logger.info("TrackStock: %s" % str(product_class[0].track_stock))
    product_class[0].track_stock = True
    self.logger.info("TrackStock: %s" % str(product_class[0].track_stock))
    product_class[0].save()

INFO Starting catalogue import
INFO  - Importing records from 'sample_inventory.csv'
INFO  - Flushing product data before import
INFO Parent items: 6, child items: 10
INFO ProductClass name: ClassName
INFO ProductClass: (<ProductClass: ClassName>, False)
INFO TrackStock: True
INFO TrackStock: True

我已经检查了管理页面,只创建了1个ProductClass,并且它的名称与传递给track_stock()的名称相同。是否还需要执行其他操作才能启用此功能?track_stock()文档比较稀疏。在输出中,track_stock在两个示例中看起来都是true。是否在创建child_objects时必须为False,然后再翻转为True?

piwo6bdm

piwo6bdm1#

为了能够正确反映任何产品的库存水平,您需要有一个将提供产品的合作伙伴,然后您需要有一个将合作伙伴和产品链接在一起的StockRecord。
首先,确保您的数据库中有每个产品变体的所有信息。
然后,您需要更新ProductClass并将"track_stock"属性设置为True,因为默认情况下该属性为None。
您还需要从子产品中移除ProductClass,因为它们从其父产品继承了ProductClass。
编辑1:
要向Product添加属性,必须为ProductClass添加ProductAttribute,然后可以像下面的示例那样直接在Product上设置属性。
编辑2:
您还需要在StockRecord上设置"net_stock_level"。
要更深入地了解Oscar如何获取库存水平,请查看选择器。该类确定要使用的定价、税收和库存水平策略,如果您希望收取税收或根据用户提供不同的定价,则可能需要在将来自定义这些策略。

2izufjch

2izufjch2#

在对test factory进行了一些研究之后,我通过指定

product.stucture = 'parent'

在父对象上,以及

product.structure = 'child'

我还需要将对象的自定义属性更改为dict product_attributes,然后在对象上设置每个值:

if product_attributes:
        for code, value in product_attributes.items():
            product_class.attributes.get_or_create(name=code, code=code)
            setattr(product.attr, code, value)

没有必要为每个父对象创建库存记录,因为它们跟踪与它们相关联的子对象的库存记录。也没有必要设置track_stock = True,因为在创建Product()时默认设置为True
此答案是由CC BY-SA 3.0下的OP Tui Popenoe以编程方式在Django Oscar中创建规范的“父”产品问题的edit

相关问题