Day10:10 - 商品服务(1) - 後端 - 总商品资料API

Kia ora,我是Charlie!
在Day09当中我们完成了用户服务的修改资料,而今天我们要完成商品模块的总商品资料API。

================================◉‿◉=================================

首先是url路径的部分,一样在ur当中包含product的url:

# products\urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
	url(r'^$',views.product)
]

# keyboardmarket\urls.py

url('product',include('product.urls'))

# product\views.py

def product(request):
	return R.ok("call success")

建立完後,我们先建立返回全部商品的API,这里我们使用GET,首先先在Product model当中建立toJson方法:

class Product(models.Model):
	id = models.AutoField(primary_key = True)
	name = models.CharField(max_length = 255,verbose_name = "商品名称")
	price = models.IntegerField(verbose_name = "价格")
	stored_amount = models.IntegerField(verbose_name = "存量")
	created_time = models.DateTimeField(auto_now = True)
	modified_time = models.DateTimeField(auto_now = True)
	status = models.IntegerField(verbose_name = "状态")
	img = models.ImageField(upload_to = "productImage/")
	category = models.IntegerField(verbose_name = "种类")
	info = models.TextField(verbose_name = "详细描述")

	def toJson(self):
		data = {}
		data["name"] = self.name
		data["price"] = self.price
		data["stored_amount"] = self.stored_amount
		data["created_time"] = self.created_time
		data["modified_time"] = self.modified_time
		data["status"] = self.status
		data["img"] = self.img.url
		data["category"] = self.category
		data["info"] = self.info
		return data

	class Meta:
		db_table = "products"

接着建立视图,筛选出状态为1(activate)的商品:

from tools.R import R
from .models import Product
from tools.db import ProductStatus

# Create your views here.
def product(request):
	if request.method == "GET":
		products = Product.objects.filter(status = ProductStatus.activate.value)
		products = [i.toJson() for i in products]
		return R.ok(products)

测试成功的话,就可以看到所有的商品:
https://ithelp.ithome.com.tw/upload/images/20210924/201416669YMBBj8fyT.png

接着我们还需要另外一个API接口:返回各种种类的商品API。

首先在urlpatterns里面建立url:

url(r'/(?P<categoryID>[\w]{1,55})$',views.product),

然後在tools\db.py中的ProductCategory中,建立static method list:

@staticmethod
def list():
	return list(map(lambda c: c.value, ProductCategory))

接着在views当中建立API,过滤出符合categoryID的商品:

from tools.db import ProductStatus,ProductCategory

if request.method == "GET" and categoryID is not None:
	if int(categoryID) not in ProductCategory.list():
		return R.badRequest("category ID does not exist")
	products = Product.objects.filter(status = ProductStatus.activate.value).filter(category = categoryID)
	products = [i.toJson() for i in products]
	return R.ok(products)

这里要注意的是,传入的categoryID为String,如果直接判断是否在ProductCategory.list当中
的话会出错,必须要加上int()转型才行,可以将两者印出看看type:

print(type(categoryID))
print(type(ProductCategory.list()[0]))

https://ithelp.ithome.com.tw/upload/images/20210924/20141666MRh3cU9B92.png

而这里还衍生了另外一个问题,如果categoryID是文字的话,转为int就会出错,所以这里要再加上防堵的程序码:

if not categoryID.isdigit():
	return R.badRequest("categoryID is number only!")

最後是返回种类的API,由於我们一开始并没有建立cateogry表及外连,在最小的更动下可以使用Enum中的value来返回,首先先建立urlpattern:

url(r'/category$',views.product),

接着在Enum当中建立dict方法:

@staticmethod
def dict():
	return {
		"键盘":ProductCategory.keyboard.value,
		"耳机":ProductCategory.earphone.value,
		"滑鼠":ProductCategory.mouse.value,
		"桌机":ProductCategory.desktop.value
	}

接着在views当中建立API:

if 'category' in request.path:
	return R.ok(ProductCategory.dict())

就可收到种类。

================================◉‿◉=================================

Day10结束了!在今天我们先完成了商品的返回资料API,明天我们将完成商品资料的前端显示,之後也会再更动cateogry的部分,让category能够从资料库捞取,See ya next day!


<<:  Day24. form_tag 与 simple_form_for 的用法 - 表单 part2

>>:  Day15 Sass import

废文好多,来搞个粉丝专页吧!

今天要分享的故事是关於我在今年初开始经营粉丝专页的收获! 进入正题 虽然现在的年轻人更偏好使用 In...

什麽是 ArchiMate?

ArchiMate 是The Open Group面向企业架构的开放且独立的建模语言,由不同的工具供...

CMoney工程师战斗营weekly5

鬼门关前走一遭生死一瞬间的一周 事情是这样的,由於一个月前的我刚进入战斗营,对物件导向的概念还是非常...

2.4.2 Design System - Badge 元件

「不用怕绕远路,会到终点就好」 高中的音乐课老师给班上所有学生每个人一张便利贴 每张上面都有一句勉...

Day26 跟着官方文件学习Laravel-Service Provider

昨天我们说到 Service Container 是一个地方绑定你类别如何产生出来,或者是你想将 i...