django商城项目中用户地址管理的增删改查
前文
先看下要实现的效果:
先写后端逻辑
要保存地址先设计Model模型
models.py写一个地址信息类
class AddressInfo(models.Model):
# 需要写外键,对应用户
user = models.ForeignKey(Users, on_delete=models.CASCADE, related_name='address', verbose_name='用户')
receiver = models.CharField(max_length=20, verbose_name='收货人')
# 导不是当前页面的外键
province = models.ForeignKey('areas.Areas', on_delete=models.PROTECT, verbose_name='省份', related_name='province_address')
city = models.ForeignKey('areas.Areas', on_delete=models.PROTECT, verbose_name='省份', related_name='city_address')
district = models.ForeignKey('areas.Areas', on_delete=models.PROTECT, verbose_name='省份', related_name='district_address')
detail_place = models.CharField(max_length=50, verbose_name='详细地址')
postcode = models.CharField(max_length=6, verbose_name='邮编')
phone = models.CharField(max_length=11, verbose_name='手机')
# 设置是否为默认地址
# 逻辑删除
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'sh_user_address'
verbose_name_plural = '地址管理'
- 逻辑删除意思是实际上不删除,但是有个布尔值为真则代表删除,不展示
- 写完注意数据库迁移makemigrations,migrate,然后admin界面注册模型
- Address模型类中的外键指向Areas/models里面的Area,指明外键ForeignKey时,可以使用字符串应用名.模型类名来定义
- related_name 在进行反向关联查询时使用的属性,如 city = models.ForeignKey(‘areas.Areas’,
related_name=‘city_address’)表示可以通过Area对象.city_address属性获取所有相关的city数据。 - ordering 表名在进行Address查询时,默认使用的排序方式
然后就是怎么设置用户的默认收货地址
可以有两种方法,一是在收货地址这个模型类中多加一个字段,证明是默认收货地址,但是这个方法在设置默认地址和取消默认地址的时候,会很麻烦,取消默认地址的时候,需要先查哪个是默认地址,然后取消那个标记,然后再设置另外一个标记,这样多增加了数据库的操作。
第二种方法是在用户表中多加一个字段,外键关联到要设置默认地址的那条记录上,这里采用这种方法
为User模型类添加默认地址
class User(AbstractUser):
...
default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='默认地址')
...
这次暂时没写这个默认地址,下次补齐
urls配置路径
from .views import *
from rest_framework.routers import DefaultRouter
# 路由器
router = DefaultRouter()
router.register(r'^addressinfo', AddressInfoView, base_name='addressinfo')
urlpatterns = []
urlpatterns += router.urls
view.py写增删改查的接口
class AddressInfoView(ModelViewSet):
# 地址增删改查
serializer_class = AddressSerCLass
# 权限
permission_classes = (IsAuthenticated, )
def get_queryset(self):
print('inner')
print(self.request.user.address.filter(is_delete=False))
return self.request.user.address.filter(is_delete=False)
def list(self, request, *args, **kwargs