Próbuję użyć zmodyfikowanej wersji klasy django-oscar import_oscar_catalogue, aby zaimportować kilka produktów z pliku CSV i podczas pierwszego kontaktu z produktem (zdefiniowanego według tytułu) , utwórz kanoniczny produkt nadrzędny, a następnie dla wszystkich przyszłych spotkań utwórz produkt podrzędny w ramach tego produktu nadrzędnego.Tworzenie kanonicznego "nadrzędnego" produktu w programie Django Oscar programowo
Wydaje się to działać, ale produkt kanoniczny nie odzwierciedla połączonych stanów magazynowych produktu podrzędnego ani nie wyświetla prawidłowych atrybutów tego produktu. Jednak poprawnie wyświetla je jako odmiany w panelu django.
W jaki sposób mogę programowo utworzyć tę relację dziecko/rodzic w produktach z prawidłowymi zapisami zapasów?
odpowiedni kod:
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() tworzy rejestr 1 magazynie dla każdej unikalnej odmianie elementu, ale stockrecords Te zmienności nie przekładają się w pozycji dominującej.
Dzięki za wszelkie sugestie.
EDYTOWANIE: Zaktualizowałem klasę metodą, która jawnie wywołuje ProductClass.objects.track_stock() przeciwko instancji ProductClass, i wywołuję ją po pętli przez wszystkie wiersze pliku CSV (przekazując go nazwa jednej klasy produktów, której używam obecnie). Jednak patrząc na zasoby w desce rozdzielczej, żadne z zasobów podrzędnych/odmian nie jest liczone względem rodzica.
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
Sprawdziłem stronie Administrator, tylko 1 jest tworzony ProductClass i ma taką samą nazwę jak jest przekazywane do track_stock(). Czy jest coś jeszcze, co należy zrobić, aby włączyć tę funkcję? track_stock() Dokumentacja jest trochę rzadka. W wyjściu funkcja track_stock wygląda tak, jak w obu przypadkach. Czy musi mieć wartość Fałsz, gdy obiekty child_object są tworzone, a następnie odwracane do True?
EDIT: ROZWIĄZANIE:
Po kilku badań z test factory, I rozwiązać problem poprzez określenie
product.stucture = 'parent'
Z obiektu nadrzędnego, a
product.structure = 'child'
na obiekcie dziecięcej. Musiałem także zmieniać atrybuty niestandardowe moich przedmiotów do dict product_attributes
, a następnie ustawić każdą wartość na obiekcie:
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)
To nie było konieczne, aby utworzyć rekord zapasów dla każdego obiektu nadrzędnego, jak oni śledzić zapisy zapasów obiektów podrzędnych, z którymi są powiązane. Nie było również ustalić track_stock = True
, jak to jest ustawione na True
domyślnie podczas tworzenia Product()
Tak, sir, jeśli posiadasz product_class na produktach potomnych, zachowują się one inaczej i jeśli nie masz atrybutu track_stock na klasie, to nie będzie dbał o twoje StockRecords. Jeśli chodzi o dynamiczne ustawianie atrybutów, musisz dodać atrybuty do ProductClass, a następnie utworzyć ProductAttributeValue –
. Dodałem więcej informacji w odpowiedzi. Daj mi znać, jeśli masz więcej pytań. –
Możesz również ustawić "net_stock_level" w StockRecord. –