首先先举例一个一对多的映射对象,示例如下:
# 1.商品类型 - GoodeType
# 1.title – 类型名称
# 2.picture – 类型图片
# 3.desc – 类型描述(提供给后台使用)
class GoodsType(models.Model):
title = models.CharField(max_length=30,verbose_name='类型标题')
# null=True表示的是可以为空
picture = models.ImageField(upload_to='static/upload/goodstype',
null=True,
verbose_name='类型图片'
)
desc = models.TextField(verbose_name='类型描述')
def __str__(self):
return self.title
# 因为json只能将列表,元组,字典转化为json字符串
def to_dict(self):
dic = {
'title':self.title,
# 其实保存在数据库中的是图片的地址,需要将地址转化为字符串
# 在json序列化时会提示不是字符串,需要强制转换为字符串
'picture':self.picture.__str__(),
'desc':self.desc,
}
return dic
class Meta:
db_table = "goods_type"
verbose_name = "商品类型"
verbose_name_plural = verbose_name
# 2.商品 – Goods
# 1. title – 商品名称
# 2. price – 商品价格
# 3. spec – 商品的规格(1盒/500g)
# 4. picture - 商品图片
# 5. goodsType – 商品类型
# 6. isActive – 是否上架,默认为True
class Goods(models.Model):
title = models.CharField(
max_length=40,
verbose_name='商品名称'
)
# max_digits:表示的所有数字的位数
price = models.DecimalField(
max_digits=7,
decimal_places=2,
verbose_name='商品价格'
)
spec = models.CharField(
max_length=20,
verbose_name='商品规格'
)
picture = models.ImageField(
upload_to='static/upload/goods',
null=True,
verbose_name='商品图片'
)
goodsType = models.ForeignKey(
GoodsType,
verbose_name='商品类型'
)
isActive = models.BooleanField(
default = True,
verbose_name='是否上架'
)
def __str__(self):
return self.title
class Meta:
db_table = 'goods'
verbose_name = '商品'
verbose_name_plural = verbose_name
GoodType是商品类型(一),Goods是商品(多)
1.正常查询
通过“多的表”查询“一的表”
good = Goods.objects.get(id=1)
goodsType = good.goodsType
2.反向查询
通过一查多
goodstype = GoodsType.objects.get(id=1)
goods = goodstype.goods_set.all()
3.将查询对象转化为json字符串的方式有
1.可以转化为json对象的有列表、字典、集合等,
如果是这些可以直接转化为json字符串。
json_data = json.dumps(json_list)
2.利用django的model_to_dict将queryset序列化成字典
json_dict = model_to_dict(good)
3.利用Django的serialize序列化成json对象
import json
from django.core.serializers import serialize
json_data = serialize('json',goods) #str
json_data = json.loads(json_datas) #序列化成json对象
注意:
第一种、第二种方式不能序列化时间类型和图片类型,第三种方式可以。