用户收货地址管理后端实现

用户收货地址管理后端实现

在用户模块中添加用户收货地址信息

class Address(models.Model):
    user=models.ForeignKey(User,on_delete=models.CASCADE,related_name='addresses',verbose_name='user')
    receiver=models.CharField(max_length=20,verbose_name='receiverinfo')
    province =models.ForeignKey('areas.Areas',on_delete=models.PROTECT,related_name='province_addresses',verbose_name='province')
    city = models.ForeignKey('areas.Areas', on_delete=models.PROTECT, related_name='city_addresses',verbose_name='city')
    district = models.ForeignKey('areas.Areas', on_delete=models.PROTECT, related_name='district_addresses',verbose_name='district')
    detail_address=models.CharField(max_length=50,verbose_name='detailaddress')
    zipcode =models.CharField(max_length=6,verbose_name='zipcode')
    tel=models.CharField(max_length=11,verbose_name='phonenum')
    is_delete=models.BooleanField(default=False,verbose_name='check_if_address_is_delete_or_not')

    class Meta:
        db_table='shanghui_user_address'
        verbose_name='User_address'
        verbose_name_plural=verbose_name

这是完成用户地址管理的必要字段,这部分的逻辑并不复杂,就是把address表和user表和areas表联系起来。

view和serializer模块中实现增删改查的逻辑

view视图

from rest_framework.viewsets import ModelViewSet
class AddressViewSet(ModelViewSet):
    serializer_class = serializers.AddressSerializer
    permission_classes = [IsAuthenticated]


    def get_queryset(self):
        print('inner')
        print(self.request.user.addresses.filter(is_delete=False))
        print(self.request.user)
        return self.request.user.addresses.filter(is_delete=False)
		# 获取token中包含的user字段
    def list(self,request):
    	# 使用view函数内的get_queryset方法,这里只是需要把取到的字段实例化使用
        query_set=self.get_queryset()
        print(self.request.user)
        print(query_set)
        print(self.get_serializer(query_set,many=True))
        # 获取之前指定的序列化器,主要是指定字段输出
        serializer_current=self.get_serializer(query_set,many=True)
        # 返回一个响应
        return Response({
            'address':serializer_current.data
        })

    def update(self, request, *args, **kwargs):
    	# 将获取到的address实例化,这里很多部分都由内置函数实现了,我们get_queryset方法已经指定
    	了这个视图的用户字段,内置函数实现了查找updata需要的特定字段。这里实例化来实现后面的某
    	个值的保存操作
        obj=self.get_object()
        obj.is_delete=True
        obj.save()
        return Response('Okay')

serializer

class AddressSerializer(serializers.ModelSerializer):
	指定需要字段的属性
    province = serializers.StringRelatedField(read_only=True)
    city = serializers.StringRelatedField(read_only=True)
    district = serializers.StringRelatedField(read_only=True)

    province_id = serializers.IntegerField(required=True)
    city_id = serializers.IntegerField(required=True)
    district_id = serializers.IntegerField(required=True)
    class Meta:
        model=models.Address
        不显示user和is_delete
        exclude=('user','is_delete')
	在serializer中实现create方法,当然也可以重写视图的create方法实现
    def create(self, validated_data):
        print('###################')
        print(self.context['request'].user)
        获取context内容,我会在模拟的时候给出这个内容
        validated_data['user']=self.context['request'].user
        将验证后的,这里是没验证直接就把数据存进去了
        return super().create(validated_data)

urls中注册视图

router=DefaultRouter()
router.register(r'addresses',views.AddressViewSet,base_name='addresses')
urlpatterns +=router.urls

在urls中添加以下字段注册视图

POSTMAN模拟

由于这里前端部分相当复杂,而且现在做的这个项目和已写的逻辑并不是完全相符,所以我会在之后的博客中具体介绍这个部分,现在我们先使用POSTMAN来模拟前端发回的请求

发送带JWT的请求

由于上面的方法是带IsAuthenticated认证方法认证的,所以我们需要在发送请求的时候带上我们的JWT
看过之前博文的读者应该知道JWT都是包含在request header里面发送的,结构是这样
在这里插入图片描述
我们现在就模拟这个来写就可以了
用户收货地址管理后端实现_第1张图片
就是选到Headers这个选项中添加Authorization这个键值,和上面的完全匹配就可以了
至于复制这个JWT,你可以在console中复制,当然也可以在网页上写一个空的div然后在JS中填充一下JWT,比如这样
在这里插入图片描述
这样就可以获得到你登录以后生成的token了。

POST请求生成一个收货地址

在body中添加form表单,并且发送到后端url地址
用户收货地址管理后端实现_第2张图片
前面视图写的逻辑这里会返回address里的东西,如下图所示
用户收货地址管理后端实现_第3张图片
回到数据库就可以查询到插入的数据了
用户收货地址管理后端实现_第4张图片

get方法得到已有的地址信息

用户收货地址管理后端实现_第5张图片
结果如图所示,但是这里我加了一个is_delete字段来检测用户是否删除了这个字段,如果用户删除了,我就给这个字段加一个is_delete=True,然后用这个属性来判断是否输出这个字段。

updata删除收货地址

注意这里我们需要完成内置的get_object()方法,需要给后端传一个primary_key。
这个Key可以包含在URL中发送,即http://127.0.0.1:8000/addresses/1/会让后端找到id为1的地址字段
用户收货地址管理后端实现_第6张图片
直接发送PUT请求就可以了,返回Okay是我自己自定义的Response,查询数据库可以看见is_delete属性已经变成1了(前面创建数据库时这个字段默认为0)
用户收货地址管理后端实现_第7张图片

你可能感兴趣的:(django项目后端流程)