我们为保存用户的地址信息,创建数据库表,在users/models.py中定义模型类
class Address(BaseModel): """ 用户地址 """ user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户') title = models.CharField(max_length=20, verbose_name='地址名称') receiver = models.CharField(max_length=20, verbose_name='收货人') province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省') city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市') district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区') place = models.CharField(max_length=50, verbose_name='地址') mobile = models.CharField(max_length=11, verbose_name='手机') tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话') email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱') is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta: db_table = 'tb_address' verbose_name = '用户地址' verbose_name_plural = verbose_name ordering = ['-update_time']
为User模型类添加默认地址
class User(AbstractUser): """用户模型类""" mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号') email_active = models.BooleanField(default=False, verbose_name='邮箱验证状态') # 默认邮件未激活 default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='默认地址') class Meta: db_table = 'tb_users' verbose_name = '用户' verbose_name_plural = verbose_name
在users/views.py中添加视图
class AddressViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, GenericViewSet): """ 用户地址新增与修改 """ serializer_class = serializers.UserAddressSerializer permissions = [IsAuthenticated] def get_queryset(self): return self.request.user.addresses.filter(is_deleted=False) def list(self, request, *args, **kwargs): """ 用户地址列表数据 """ queryset = self.get_queryset() serializer = self.get_serializer(queryset, many=True) user = self.request.user return Response({ 'user_id': user.id, 'default_address_id': user.default_address_id, 'limit': constants.USER_ADDRESS_COUNTS_LIMIT, 'addresses': serializer.data, }) def create(self, request, *args, **kwargs): """ 保存用户地址数据 """ # 检查用户地址数据数目不能超过上限 count = request.user.addresses.count() if count >= constants.USER_ADDRESS_COUNTS_LIMIT: return Response({'message': '保存地址数据已达到上限'}, status=status.HTTP_400_BAD_REQUEST) return super().create(request, *args, **kwargs) def destroy(self, request, *args, **kwargs): """ 处理删除 """ address = self.get_object() # 进行逻辑删除 address.is_deleted = True address.save() return Response(status=status.HTTP_204_NO_CONTENT) @action(methods=['put'], detail=True) def status(self, request, pk=None, address_id=None): """ 设置默认地址 """ address = self.get_object() request.user.default_address = address request.user.save() return Response({'message': 'OK'}, status=status.HTTP_200_OK) @action(methods=['put'], detail=True) def title(self, request, pk=None, address_id=None): """ 修改标题 """ address = self.get_object() serializer = serializers.AddressTitleSerializer(instance=address, data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data)
在users/serializers.py中添加序列化器
class UserAddressSerializer(serializers.ModelSerializer): """ 用户地址序列化器 """ province = serializers.StringRelatedField(read_only=True) city = serializers.StringRelatedField(read_only=True) district = serializers.StringRelatedField(read_only=True) province_id = serializers.IntegerField(label='省ID', required=True) city_id = serializers.IntegerField(label='市ID', required=True) district_id = serializers.IntegerField(label='区ID', required=True) class Meta: model = Address exclude = ('user', 'is_deleted', 'create_time', 'update_time') def validate_mobile(self, value): """ 验证手机号 """ if not re.match(r'^1[3-9]\d{9}$', value): raise serializers.ValidationError('手机号格式错误') return value def create(self, validated_data): """ 保存 """ validated_data['user'] = self.context['request'].user return super().create(validated_data) class AddressTitleSerializer(serializers.ModelSerializer): """ 地址标题 """ class Meta: model = Address fields = ('title',)
在users/urls.py中添加路由
from rest_framework import routers # 用户地址管理路由 router = routers.DefaultRouter() router.register(r'addresses', views.AddressViewSet, base_name='addresses') urlpatterns += router.urls
在users/constants.py中添加用户地址条数上限
# 用户地址条数上限 USER_ADDRESS_COUNTS_LIMIT=20
以上就是实现收货地址的增删改查功能了