Programmatically creating products is particularly useful when importing data from an external database into a Django Oscar project.
In the code below there's an example on how to create a single product.
from oscar.apps.catalogue.models import *
from oscar.apps.partner.models import *
from django.core.files import File
from decimal import Decimal
import os
product_type = "Books"
partner = "New Partner"
category1_slug = "engineering-books"
category1_name = "Engineering Books"
category2_slug = "technical-books"
category2_name = "Technical Books"
product_title = "Test"
product_description = "Product Description"
product_upc = "121311"
product_sku = "121311"
product_price = Decimal('10.00')
product_image = "product_images/logo.png"
product_stock = 100
product_low_stock_threshold = 10
attribute_weight = "0.5"
attribute_pages = "800"
attribute_author = "Ross"
attribute_language = "English"
product_class, _ = ProductClass.objects.get_or_create(name = product_type)
product = Product.objects.create( title = product_title, product_class = product_class)
product.description = product_description
product.upc = product_upc
product.save()
#Categories
category1 = Category.objects.filter(slug = category1_slug).first()
if not category1: category1 = Category.add_root(name = category1_name, slug = category1_slug)
product.categories.add(category1)
category2 = Category.objects.filter(slug = category2_slug).first()
if not category2: category2 = Category.add_root(name = category2_name, slug = category2_slug)
product.categories.add(category2)
#Partner
partner, _ = Partner.objects.get_or_create(name = partner)
#Attributes
attribute = ProductAttribute.objects.get(name = 'weight')
ProductAttributeValue.objects.create( product = product, attribute = attribute, value = attribute_weight )
attribute = ProductAttribute.objects.get(name = 'Pages')
ProductAttributeValue.objects.create( product = product, attribute = attribute, value = attribute_pages )
attribute = ProductAttribute.objects.get(name = 'Author')
ProductAttributeValue.objects.create( product = product, attribute = attribute, value = attribute_author )
attribute = ProductAttribute.objects.get(name='Language')
option = attribute.option_group.options.filter(option=attribute_language).first()
ProductAttributeValue.objects.create( product = product, attribute = attribute, value_option=option )
#Stock and pricing
StockRecord.objects.create(
product=product,
partner=partner,
partner_sku=product_sku,
price= product_price,
num_in_stock=product_stock,
low_stock_threshold=product_low_stock_threshold,
)
#Images
if os.path.exists(product_image):
with open(product_image, 'rb') as f:
ProductImage.objects.create(
product=product,
original=File(f),
caption=product_title,
display_order=0
)
else:
print(f"Image not found: {image_path}")
print(f"Product '{product.title}' successfully created!")
python manage.py shell
exec(open("create_product.py").read())
Tested with: Django 5.2 Django-Oscar 4
08 Aug. 2024
|
Last Updated: 02 Dec. 2025
|
jaimedcsilva Related