Django-客户管理模块(3)客户权限
Django-客户管理模块(3)客户权限

Django-客户管理模块(3)客户权限

除了登陆的人可以看,我们还期望对应的销售只能看到自己的客户。

因为之前的客户模型里没有对应的负责人或者说销售,所以我们需要修改一下models.py,在客户模型里加入一个外键,建立和销售表(用户表)的联系。

class Customer(models.Model):
    id = models.AutoField(primary_key=True)  # 自增主键
    name = models.CharField(max_length=150, blank=False, null=False)
    email = models.EmailField(blank=True, null=True)
    phone = models.CharField(max_length=15, blank=True, null=True)
    address = models.CharField(max_length=255, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    owner = models.ForeignKey(User, related_name='customers', on_delete=models.CASCADE)  # 新增外键

    def __str__(self):
        return self.name

至于视图函数,加入owner=self.request.user即可:

class CustomersSet(viewsets.ModelViewSet):
    serializer_class = CustomerSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ["name", "email", "phone", "address"]
    ordering_fields = ["created_at", "updated_at", "name"]
    # 启用 DRF 自带的过滤后端。
    # SearchFilter:允许在 URL 上用 ?search=关键字 来搜索数据。
    # OrderingFilter:允许在 URL 上用 ?ordering=字段名 来排序。
    permission_classes = [IsAuthenticated]  # 加上这行,给 API 上锁!

    def get_queryset(self):
        # 查询函数
        return Customer.objects.filter(owner=self.request.user)  # 只返回当前用户

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

不过这样做会容易出现一个问题,就是加入我用A用户登录,但是实际上我输入客户时,在表格下方会出现一个Owner,可以通过下拉菜单选取。但是无论选谁,实质上Owner都是当前的用户。

嗯……解决问题最有效的方式就是解决提出问题的人,让用户看不到这个owner选项就可以了,哈哈哈哈。

这儿可以修改serializers.py文件,告诉那些字段不能选择,而是只读。

# crm/serializers.py

from rest_framework import serializers
from .models import Customer

class CustomerSerializer(serializers.ModelSerializer):
    # 👇 核心改动:明确定义 owner 字段
    # StringRelatedField 会使用关联对象(User)的 __str__ 方法(也就是用户名)来表示
    # 并且,我们明确地让它成为一个只读字段。
    owner = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Customer
        fields = [
            'id', 
            'name', 
            'email', 
            'phone', 
            'address', 
            'owner', 
            'created_at', 
            'updated_at'
        ]

这样的话,就没有问题了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注