이 글은 Django E-commerce OpenSource인 Saleor에서 얻은 팁들을 정리한 문서입니다.
1. 값을 증분할 때는 increase / decrease 동사를 prefix으로 붙인다.
def increase_voucher_usage(voucher):
voucher.used = F('used') + 1
voucher.save(update_fields=['used'])
def decrease_voucher_usage(voucher):
voucher.used = F('used') - 1
voucher.save(update_fields=['used'])
2. 상태를 확인할 때에는 is 동사를 prefix으로 붙인다.
def is_category_on_sale(category, sale):
"""Check if category is descendant of one of categories on sale."""
discounted_categories = set(sale.categories.all())
return any([
category.is_descendant_of(c, include_self=True)
for c in discounted_categories])
상태를 의미할 때에는 전치사 on을 붙인다.
3. 가능 여부를 확인할 때에는 can 동사를 prefix으로 붙인다.
def can_charge(self):
not_fully_charged = (
self.charge_status == ChargeStatus.CHARGED
and self.get_total() > self.get_captured_amount())
return self.is_active and (self.not_charged or not_fully_charged)
def can_void(self):
return self.is_active and self.not_charged and self.is_authorized
def can_refund(self):
return (
self.is_active and self.charge_status == ChargeStatus.CHARGED
and self.gateway != CustomPaymentChoices.MANUAL)
4. 포함여부를 확인할 때에는 contain 동사를 prefix으로 붙인다.
def contains_unavailable_variants(cart):
"""Return `True` if cart contains any unfulfillable lines."""
try:
for line in cart:
line.variant.check_quantity(line.quantity)
except InsufficientStock:
return True
return False
5. 데이터로 별도의 처리를 하는 경우 process 동사를 prefix으로 붙인다.
@transaction.atomic
def create_order(cart, tracking_code, discounts, taxes):
order_data = _process_voucher_data_for_order(cart)
order_data.update(_process_shipping_data_for_order(cart, taxes))
order_data.update(_process_user_data_for_order(cart))
order_data.update({
'language_code': get_language(),
'tracking_client_id': tracking_code,
'total': cart.get_total(discounts, taxes)})
def process_payment(
payment_information: Dict, connection_params: Dict) -> Dict:
auth_resp = authorize(payment_information, connection_params)
if auth_resp['is_success']:
payment_information['token'] = auth_resp['transaction_id']
return [auth_resp, capture(payment_information, connection_params)]
return [auth_resp, void(payment_information, connection_params)]
6. 객체를 딕셔너리로 변환할 때에는 as_dict를 suffix으로 붙인다.
def price_as_dict(price):
if price is None:
return None
return {
'currency': price.currency,
'gross': price.gross.amount,
'grossLocalized': prices_i18n.amount(price.gross),
'net': price.net.amount,
'netLocalized': prices_i18n.amount(price.net)}
def price_range_as_dict(price_range):
if not price_range:
return None
return {
'maxPrice': price_as_dict(price_range.start),
'minPrice': price_as_dict(price_range.stop)}
7. 객체를 특정 객체에 담는 행동을 할 때에는 add to 형식을 사용한다.
def product_add_to_cart(request, slug, product_id):
...
def add_variant_to_order(request, order_pk):...
'소프트웨어-이야기 > 프로그래밍 언어와 프레임워크' 카테고리의 다른 글
(Django) CacheOps - ORM에 Redis Cache 쉽게 적용하기 (6) | 2019.05.12 |
---|---|
(Django) cached_property 란? (1) | 2019.04.20 |
(Django) Django ORM에서 Row Lock 잡기 - select_for_update (2) | 2018.12.15 |
(Django) Django로 e-commerce 개발할 때 참고하기 좋은 오픈소스 (0) | 2018.10.20 |
(Django) Rest Frame Work Filter 활용하기 (0) | 2018.09.09 |