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

20

我试图使用修改过的 django-oscar import_oscar_catalogue 类从 CSV 中导入一堆产品,在第一次遇到一个产品(由标题定义)时,创建一个规范的父产品,然后在所有未来的遭遇中,在该父产品下创建子产品。

这似乎可行,但是规范产品不反映子产品的组合库存水平,也不显示该产品的正确属性。 但它在 Django 仪表板中正确地将它们列为变体。

如何以编程方式创建产品的子/父关系,并具有正确的库存记录?

相关代码:

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()函数会为每种商品变体创建一个库存记录,但是这些变体的库存不会转化为其父商品的库存。 编辑: 我已经在类中更新了一个方法,它显式调用ProductClass.objects.track_stock()对ProductClass实例进行跟踪库存,并在通过CSV文件的所有行进行循环后调用它(传递当前使用的一个产品类的名称)。但是,在查看仪表板上的库存时,没有任何子/变体库存计入父项。
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?

2个回答

5
为了能够正确反映任何产品的库存水平,您需要有一个合作伙伴来提供该产品,然后您需要有库存记录将合作伙伴和产品联系在一起。
首先,请确保您在数据库中拥有每个产品变体的所有信息。

然后您需要更新您的产品类并将“跟踪库存”属性设置为True,因为默认情况下为None。

您还需要从子产品中删除产品类,因为它们会从其父产品继承产品类

编辑1:

要向产品添加属性,您必须为ProductClass添加ProductAttribute,然后可以直接在Product 像这个例子上设置属性。

编辑2:

您还需要在StockRecord上设置"net_stock_level"。

要深入了解Oscar如何获取库存水平,请查看Selector。该类确定要使用哪些定价、税收和库存水平策略,如果您想根据用户收取税费或提供不同的定价,则将来可能需要自定义这些策略。


1
是的先生,如果您在子产品上有一个product_class,它们会表现得不同,如果您在类上没有track_stock属性,它将不关心您的StockRecords。关于动态设置属性,您需要将属性添加到ProductClass,然后创建ProductAttributeValue。 - Alex Carlos
我在答案中添加了更多信息。如果您有进一步的问题,请告诉我。 - Alex Carlos
您可能还需要在StockRecord上设置"net_stock_level"。 - Alex Carlos
我不认为您需要在父产品上拥有StockRecord。只要子产品具有此值,您就应该能够查看父产品的库存计数。 - Alex Carlos
请告诉我,您是否能够正确显示规范产品的库存记录计数。 - Alex Carlos
对我来说,我想创建产品变体,只需要设置“track_stock”,是的,现在我可以手动创建产品变体了。 - SalahAdDin

0

经过从测试工厂的一些研究,我通过指定解决了这个问题

product.stucture = 'parent' 

在父对象上,以及

product.structure = 'child'

在子对象上。我还需要将对象的自定义属性更改为字典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)

没有必要为每个父对象创建库存记录,因为它们跟踪与其关联的子对象的库存记录。创建 Product() 时,默认情况下将 track_stock = True,因此不需要设置。


这个答案是由 OP Tui Popenoe 发表于 edit Django Oscar编程问题的创建规范化的“父”产品,遵循 CC BY-SA 3.0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接