ttsx1
on_delete=models.CASCADE
外键中设置的:
删除关联数据,与之关联也删除
如: category = mF('GoodsType', '商品类型', on_delete=models.CASCADE)
从上面外键(ForeignKey)和一对一(OneToOneField)的参数中可以看出,都有on_delete参数,而 django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:
TypeError: init() missing 1 required positional argument: 'on_delete'
原文链接:https://blog.csdn.net/buxianghejiu/article/details/79086011
Django中提供了一个AbstractUser类
我们可以用来自由的定制我们需要的model
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
'''
继承Django的AbstractUser 并向里面添加两条数据内容
'''
gender = models.CharField(max_length=6,choices=(('male','男'),('female','女')),default='female',verbose_name='性别')
memo = models.TextField(null=True, blank=True,verbose_name='便签')
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name #指定模型的复数形式是什么,如果不指定Django会自动在模型名称后加一个’s’
在完成后需要在settings.py中设置
AUTH_USER_MODEL = 'app.UserProfile'
来覆盖Django默认的表
在admin.py中注册UserProfile表
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import UserProfile
# Register your models here.
admin.site.register(UserProfile,UserAdmin)#用UserAdmin去注册UserProfile
原文链接:https://blog.csdn.net/lht_521/article/details/80592543
verbose_name 和 verbose_name_plural
db_column和db_table
1.指定字段名: 在定义字段的时候,增加参数db_column=’real_field’;
2.指定表名: 在model的class中,添加Meta类,在Meta类中指定表名db_table
例如在某个models.py文件中,有一个类叫Info:
class Info(models.Model):
'''''
信息统计
'''
app_id = models.ForeignKey(App)
app_name = models.CharField(verbose_name='应用名', max_length=32, db_column='app_name2')
class Meta:
db_table = 'info'
verbose_name = '信息统计'
verbose_name_plural = '信息统计'
其中db_column指定了对应的字段名,db_table指定了对应的表明;
如果不这样指定,字段名默认为app_name, 而表明默认为app名+类名: [app_name]_info.
verbose_name指定在admin管理界面中显示中文;verbose_name表示单数形式的显示,verbose_name_plural表示复数形式的显示;中文的单数和复数一般不作区别。
抄于:https://www.cnblogs.com/wangkun122/articles/9291255.html
RESTful API 设计指南
抄于:<http://www.ruanyifeng.com/blog/2014/05/restful_api.html
select_related和prefetch_related的用法与区别
Python实现支付宝在线支付
抄于: https://www.cnblogs.com/ctztake/p/8513628.html
压缩zipfile
抄于:https://www.cnblogs.com/ctztake/p/9141259.html
数据结构
抄于:https://www.cnblogs.com/ctztake/p/8411252.html
drf认证
抄于:https://www.cnblogs.com/wangkun122/articles/8750656.html
https://www.cnblogs.com/ctztake/p/8419059.html
https://www.cnblogs.com/shi-qi/articles/9629399.html
django PermissionsMixin? 据说不好使,但是道听途说怎么算数,做事实的践行者。不?实用。https://blog.csdn.net/weixin_42134789/article/details/84567337?
表结构
1)个人
用户
地址
2)商品
商品sku(各个版本) 如:iPhone11 256g
商品分类 如:iPhone
商品spu(商品名) 如:iPhone11
商品图片
首页分类 --》 不是图片的
首页轮播
促销活动
3)购物车
redis实现
4)订单
订单模型
订单商品
1)个人
先建一个基类表 : 创建的时候都有创建时间的
from django.db import models
class BaseModel(models):
create_time = mD(a_a= True, '创建时间')
update_time = mD(a_n = True, '更改时间')
is_delete = mBool(default = False, '是否删除')
应该是:
class BaseModel(models.Model):
...
class Meta:
abstract = True # 指定这个类是一个抽象模型类
用户,继承abstractauth
这个类中有id,name,pwd,email,is_detele...
用户表
from django.auth.contrib.models import Ab..
from db.models import BaseModel
class User(Abstrauth, BaseModel):
class Meta:
db_table = 'df_user'
verbose_name = '用户'
verbose_name_pural = verbose_name
先建一个获取地址的表
定义获取默认地址的方法、定义获取所有地址的方法。
class AddressManger(models.Manager):
def getdefaultaddress(self, user): # 获得默认地址
try:
# address = models.user.get(user=user, is_default = True)
# 错了 或者 Address.objects.get()
address = self.get(user=user, is_default = True)
# except user.Donotexists: # 下面的错的也这样该
except self.model.DoesNotExist:
address = None
return address
def getaddress(self, user): # 获得地址
try:
address = models.user.get(user=user)
except user.Donotexists:
address = None
return address
地址表
地址有id,用户(外键),地址,邮编,电话,是否默认地址,
class Address(BaseModels):
name = mF('User', '所属账户') # user
# 漏了
receiver = mC(20,'收件人')
addr = mC(128, '收件地址')
mail = mE(6, '邮编') # zip_code
phone = mC(11,'联系电话')
is_default = mB(default=True, '是否默认')
class Meta:
db_table = 'df_address'
verbose_name = '地址'
verbose_name_pural = verbose_name
2)商品
商品sku
商品有type(外键Goods),goods(外键GoodsSPU),名称,简介,价格,单位,库存,销量,商品图片,状态
SKU---> SPU(商品最小)
class GoodsSKU(BaseModels):
STATE_TYPE_CHOICES =
(
(0,'下架'),
(1,'上架')
)
type = mF('Goods', '商品种类')
goods = mF('GoodsSPU', '商品SPU')
name = mC(20,'商品名')
desc = mC(256, '商品简介')
price = mD(10, d_p=2, '商品价格')
unite = mC(10, '商品单位')
image = mI(upload = 'goods', '商品图片')
# stock = mI(10,default=1, '商品库存')
# sales = mI(10,default=0, '商品销量')
stock = mI(default=1, '商品库存')
sales = mI(default=0, '商品销量')
status = mSI(default=1, choices = STC, '商品状态')
class Meta:
db_table = 'df_goods_sku'
verbose_name = '商品SKU'
verbose_name_pural = verbose_name
商品种类
商品种类表字段有 名称,标识,图片,标题
class GoodType(BaseModel):
name = mC(10, '商品种类')
logo = mC(10, '商品标识')
image = mI(upload_to='goods', '商品图片')
class Meta:
db_table = 'df_goods_type'
verbose_name = '商品种类'
verbose_name_pural = verbose_name
def __str__(self):
return self.name
错误的:
多写了,首页分类商品展示模型类里的
STAUTS_CHOICES = (
(1,'标题'),
(2,'图片')
)
stauts = mSI(defalut=1, '')
少了
def __str__(self):
return self.name
商品SPU
- 记录网站所以商品的小类类别信息
- 表字段:ID、名称、详情
引入富文本
安装 django_tinymce == ..
配置 Instal_app = 'tinymce'
TINYMCE_DEFAULT_CONFIG = {'theme':'advanced', 'width':600, 'height':400}
项目中导入 url(r'^tinymce/$',include('tinymce.urls')), # 富文本编辑器
表字段有名称,链接,描述
from tinymce import HtmlField
class Goods(BaseModel):
name = mC(10, '商品SPU名')
# url = HtmlField('', '商品链接')
# image = mI(upload_to='goods', '商品图片')
# 后抄
detail = HtmlField(blank=True, '商品详情')
class Meta:
db_table = 'df_goods'
verbose_name = '商品SPU'
verbose_name_pural = verbose_name
关于商品首页图片等活动字段小结
banner---横幅;
商品图片 首页分类(没有图片) 首页商品轮播 促销活动
表 | 字段 | 字段 | 字段 | 字段 |
---|---|---|---|---|
GoodsImage | sku(F('GSKu')) | image goods | ||
IndexTypeGoodsBanner | sku(F('GSKU')) | category(F'GT') | displ_type | index |
IndexGoodsBanner | sku(F('GSKu')) | image banner | index | |
IndexPromotionBanner | name | url('活动链接') | image banner | index |
外键的都要+on_delete=models.CASCADE ((里)三个内容)
首页分类需要用到GoodsType里的字段 --> 所以category(F'GT')
image 是图片好像要到DFS中加载把,还是什么? 用的upload_to = 'goods'/'banner'
index 都是展示顺序 mSI(default=0,'展示顺序')
商品图片表
class GoodsImage(BaseModel):
name = mC(10, '商品名')
不熟(抄):
sku = Fk('GoodsSKu', '商品',on_delete=models.CASCADE)
image = mI(upload_to = 'goods', '图片路径')
class Meta:
'df_goods_image'
'商品图片'
-
记录所有商品的图片url
-
表字段:ID、SKU ID(外键)、图片URL
首页分类商品表
字段是goodtype的外键? 前面的也有照片,和这里的有什么不同。
class GoodsType(BaseModel):
不熟(抄):
外键
on_delete=models.CASCADE
# 删除关联数据,与之关联也删除
class IndexTypeGoodsBanner(BaseModel):
DISPLAY_TYPE_CHOICES = (
(0,'标题'),
(1,'图片'),
)
category = mF('GoodsType', '商品类型', on_delete=models.CASCADE)
sku = mF('GoodsSKu','商品SKU', on_delete=mC)
display_type = mSI(default=1, choices=DTC, '展示类型')
index = mSI(default=0, '展示顺序')
class Meta:
'df_index_type'
'主页分类展示'
- 首页各类商品要显示的商品
- 表字段:ID、商品种类ID(外键)、SKU ID(外键)、展示类型(标题或图片)、展示顺序
商品首页轮询表
class IndexGoods(BaseModel):
不熟(抄):
-
记录首页轮播区的商品信息
-
表字段:ID、 SKU ID(外键)、图片URL、展示顺序
-
class IndexGoodsBanner(BaseModel): sku = mF('GoodsSKU', '商品', on_delete) image = mI(upload_to='banner', '图片') index = mSI(default=0, '展示顺序') class Meta: 'df_index_banner' '首页轮播商品'
首页促销活动表
class GoodsProtomtion(BaseModel):
不熟(抄):
-
记录首页要展示的促销活动信息
-
表字段:ID、活动图片、活动页面链接URL、展示顺序
-
class IndexPromotionBanner: name = mC(20,'活动名称') url = mC(256,'活动链接') image = mI('banner','活动图片') index = mSI(default=0, '展示顺序') class Meta: 'df_index_promotion' '主页促销活动'
4)订单
为什么有两个订单? 一个是订单关联了用户,一个关联了商品
订单信息
class Order(BaseModel):
PAY_METHODS = (
1,'货到付款',
2,'微信支付',
3,'支付宝支付',
4,'银联支付'
)
PAY_METHODS_CHOICES =(
(1,'货到付款'),
(2,'微信支付'),
(3,'支付宝支付'),
(4,'银联支付')
)
ORDER_STATUS = (
1,'已发货',
2,'已收货',
3,'已评价',
5,'')
ORDER_STATUS_CHOICES = (
(1,'已发货'),
(2,'已收货'),
(3,'已评价'),
(5,''))
# 后抄
order_id = mC(128,primary_key=True,'订单id')
user = mF('user.User','用户', ondelete)
addr = mF('user.address', '地址', ondelete)
pay_method = mSI(choices=PMC, default=1,'支付方式')
total_num = mI(default=1, '商品总数') # de=1?
total_price = mD(10,2, '商品总价')
trific_pay = mD(10,2, '订单运费')
order_status = mSI(choices=OSC, default=1,'订单状态')
# 后抄
trade_no = mC(128,default='','支付编号')
class Meta:
db_table = 'df_order' # df_order_info
verbose_name = '订单'
verbose_name_pural = verbose_name
订单商品
class OrderGood(BaseModel):
order = mF('Order','订单') # on_delete
goods = mF('goodsku', '商品SKU') # on_delete
num = mC(10, '商品数目')
price = mD(10,'商品价格')
class Meta:
db_table = 'df_order_goods'
verbose_name = '订单商品'
verbose_name_pural = verbose_name
少写了
comment= mC(256,default='','评论')
配置settings
import pymysql
pymysql.install_as_MySQLdb()
dababase = [
'ENGINE' : 'django.db.backend.mysql',
'NAME','HOST','PORT','USER','PASSWORD',
]
除此之外,因为我们使用了django内置的认证User类,并自定义了一个子类。因此需要在settings中指定应该采用的认证User类
# 指定django认证系统使用的用户模型类
AUTH_USER_MODEL= 'user.User'