Я новичок в Django Oscar framework.
Моя цель состоит в том, чтобы администратор мог создать пакет продуктов с количеством, а также он мог добавить массовое предложение к этому пакету (Absolute или FIxed Benefit). Упаковка товара должна соответствовать количеству товара в корзине, тогда предложение будет действовать.
Например,
PRODUCT PACKAGE A
PRODUCT A has 1 quantity
PRODUCT B has 2 quantity
Чтобы создать эту вещь, я расширяю модель диапазона и добавляю поле количества. Кроме того, я расширяю условие и создаю пользовательское условие упаковки, чтобы проверить, соответствует ли корзина этому количеству продукта. Если в корзине есть это количество продукта или количество, превышающее его, будет добавлена выгода.
, а другая вещь, если у ПРОДУКТА А есть одно предложение. и если в ПРОДУКТЕ А в корзине содержится 2 или более количества, вышеуказанное предложение пакета продукта и одно предложение также необходимо применять отдельно, например
,
class RangeProduct(AbstractRangeProduct):
''' add quantity field to default model '''
quantity = models.PositiveIntegerField(default=0)
def __str__(self):
return "{} quantity {}".format(self.product, self.quantity)
class Package(models.Model):
DISCOUNT_FIXED = 'DISCOUNT_FIXED'
DISCOUNT_PERCENTAGE = 'DISCOUNT_PERCENTAGE'
DISCOUNT_TYPES = (
(DISCOUNT_FIXED, 'Discount is a fixed amount off of the products value'),
(DISCOUNT_PERCENTAGE, 'Discount is a percentage off of the products value')
)
package_type = models.ForeignKey(
PackageType,
on_delete=models.CASCADE,
related_name='packages',
)
name = models.CharField(max_length=255, verbose_name='Package Name')
banner = models.ImageField(upload_to='images/packages', null=True, blank=True)
shop_type_field = models.CharField(choices=ShopTypes.shop_type_choices, max_length=255, null=True)
discount_type = models.CharField(verbose_name='Discount Type', choices=DISCOUNT_TYPES, max_length=255)
discount_value = fields.PositiveDecimalField(
verbose_name='Discount Value', decimal_places=2,
max_digits=12, default=0
)
total_amount = fields.PositiveDecimalField(
verbose_name='Discount Value', decimal_places=2,
max_digits=12, default=0
)
offer = models.ForeignKey(
Condition,
on_delete=models.CASCADE,
related_name="product_package"
)
def __str__(self):
return self.name
def check_is_satisfied(self, basket):
conditonOBJ = self.offer
rangeOBJ = conditonOBJ.range
all_products_data = {}
for rangeLine in RangeProduct.objects.filter(range=rangeOBJ):
rangeID = rangeLine.id
rangeProduct = rangeLine.product
rangeQuantity = rangeLine.quantity
basket_Line = self.get_basket_line(basket=basket, product=rangeProduct)
if basket_Line is None:
all_products_data[rangeID] = False
else:
# if has product
# then check its quantity with basket quantity
if rangeQuantity == 0:
all_products_data[rangeID] = False
elif rangeQuantity <= basket_Line.quantity:
all_products_data[rangeID] = True
else:
all_products_data[rangeID] = False
# check if all product data is true
return all(all_products_data.values())
class ProductPackageOffer(Condition):
name = "Product Package Offer"
class Meta:
proxy = True
def is_satisfied(self, offer, basket):
print("is_satisfied package condition")
package = offer.condition.product_package.all().first()
if package is None:
return False
else:
return package.check_is_satisfied(basket=basket)
это условие пакета я проверил, соответствует ли пакет количеству корзины, а также мне нужно создать пользовательское преимущество, чтобы добавить одноразовое и оптовое предложение. я застрял в этой вещи