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视图
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)
router=DefaultRouter()
router.register(r'addresses',views.AddressViewSet,base_name='addresses')
urlpatterns +=router.urls
在urls中添加以下字段注册视图
由于这里前端部分相当复杂,而且现在做的这个项目和已写的逻辑并不是完全相符,所以我会在之后的博客中具体介绍这个部分,现在我们先使用POSTMAN来模拟前端发回的请求
由于上面的方法是带IsAuthenticated认证方法认证的,所以我们需要在发送请求的时候带上我们的JWT
看过之前博文的读者应该知道JWT都是包含在request header里面发送的,结构是这样
我们现在就模拟这个来写就可以了
就是选到Headers这个选项中添加Authorization这个键值,和上面的完全匹配就可以了
至于复制这个JWT,你可以在console中复制,当然也可以在网页上写一个空的div然后在JS中填充一下JWT,比如这样
这样就可以获得到你登录以后生成的token了。
在body中添加form表单,并且发送到后端url地址
前面视图写的逻辑这里会返回address里的东西,如下图所示
回到数据库就可以查询到插入的数据了
结果如图所示,但是这里我加了一个is_delete字段来检测用户是否删除了这个字段,如果用户删除了,我就给这个字段加一个is_delete=True,然后用这个属性来判断是否输出这个字段。
注意这里我们需要完成内置的get_object()方法,需要给后端传一个primary_key。
这个Key可以包含在URL中发送,即http://127.0.0.1:8000/addresses/1/会让后端找到id为1的地址字段
直接发送PUT请求就可以了,返回Okay是我自己自定义的Response,查询数据库可以看见is_delete属性已经变成1了(前面创建数据库时这个字段默认为0)