2016-01-28 8 views
16

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()

Odpowiedz

2

Aby móc prawidłowo odzwierciedla poziom zapasów dla każdej Product trzeba mieć Partner że dostarczy produktu, a następnie musisz mieć StockRecord, który łączy Partnera i Produkty razem.

Najpierw upewnij się, że masz wszystkie te informacje w bazie danych dla każdej z Twoich odmian Product.

Następnie należy zaktualizować swój ProductClass i ustawić atrybut "track_stock" jako True, ponieważ jego Brak jest domyślnie.

Musisz również usunąć ProductClass z produktów podrzędnych, ponieważ odziedziczyły one ProductClass ze swojego Produktu Macierzystego.

EDIT 1:

Aby dodać atrybuty do Produktu trzeba dodać ProductAttribute dla ProductClass a następnie można ustawić atrybuty bezpośrednio na produkcie like this example.

EDIT 2:

Należy również ustawić "net_stock_level" na StockRecord.

Aby dokładniej przyjrzeć się, w jaki sposób Oscar sprawdza stan zapasów na Selector. Ta klasa określa strategie cenowe, podatkowe i strategie zasobów, które mogą być potrzebne do dostosowania w przyszłości, jeśli chcesz naliczać podatek lub oferować różne ceny w zależności od użytkownika.

+1

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 –

+0

. Dodałem więcej informacji w odpowiedzi. Daj mi znać, jeśli masz więcej pytań. –

+0

Możesz również ustawić "net_stock_level" w StockRecord. –

Powiązane problemy