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
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值