python - Cree un producto "padre" canónico en Django Oscar programáticamente
python-2.7 django-oscar (1)
Estoy tratando de usar una versión modificada de la clase django-oscar import_oscar_catalogue para importar un montón de productos desde un CSV, y en el primer encuentro de un producto (definido por el título), crear un producto principal canónico, y luego para todos Los encuentros futuros crean un producto secundario bajo ese producto principal.
Esto parece funcionar, pero el producto canónico no refleja los niveles de stock combinados del producto secundario, ni muestra los atributos correctos para ese producto. Sin embargo, los enumera correctamente como variaciones dentro del tablero de mandos de django.
¿Cómo puedo crear esta relación hijo / padre mediante programación en los productos, con los registros de stock correctos?
Código relevante:
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 () crea un registro de 1 stock para cada variación de artículo único, pero los valores de stock de esta variación no se traducen al elemento principal.
Gracias por cualquier sugerencia.
EDITAR: He actualizado la clase con un método que llama explícitamente a ProductClass.objects.track_stock () contra la instancia de ProductClass, y lo llamo después de recorrer todas las filas del archivo CSV (pasándole el nombre del único producto clase que utilizo actualmente). Sin embargo, al mirar el stock en el tablero de mandos, ninguno del stock secundario / variaciones se cuenta contra el principal.
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
He comprobado la página de administración, solo se crea 1 ProductClass y tiene el mismo nombre que se pasa a track_stock (). ¿Hay algo más que deba hacerse para habilitar esta función? track_stock() documentación de track_stock() es un poco dispersa. En la salida, track_stock parece que es cierto en ambos casos. ¿Tiene que ser falso mientras se crean los objetos_dijosos y luego se vuelven verdaderos?
EDITAR: SOLUCIÓN:
Después de algunas investigaciones de la fábrica de pruebas , resolví el problema especificando
product.stucture = ''parent''
En el objeto padre, y
product.structure = ''child''
en el objeto hijo. También necesitaba cambiar los atributos personalizados de mis objetos a un atributo de atributos de producto, y luego establecer cada valor en el objeto:
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)
No fue necesario crear un registro de stock para cada objeto principal, ya que rastrean los registros de stock de los objetos secundarios a los que están asociados. Tampoco fue necesario establecer track_stock = True
, ya que se establece en True
de forma predeterminada al crear un Product()
Para poder reflejar correctamente los niveles de stock de cualquier Product , necesita tener un Partner que suministrará el producto y, luego, deberá tener StockRecord que vincula al socio y los productos.
Primero asegúrese de tener toda esa información en la base de datos para cada una de las variaciones de su Product .
Luego debe actualizar su ProductClass y establecer el atributo " ProductClass " como verdadero desde su valor predeterminado de forma predeterminada.
También debe eliminar la ProductClass de producto de sus productos secundarios, ya que heredan la ProductClass de ProductClass de su producto principal.
EDITAR 1:
Para agregar atributos a un Producto, debe agregar un ProductAttribute para ProductClass y luego puede establecer los atributos directamente en el Producto como este ejemplo .
EDIT 2:
También debe configurar "net_stock_level" en el Registro de existencias.
Para obtener una visión más detallada de cómo obtiene Oscar los niveles de stock al Selector . Esta clase determina qué estrategias de fijación de precios, impuestos y nivel de stock usar, que puede necesitar personalizar en el futuro si desea cobrar impuestos u ofrecer precios diferentes según el usuario.