除了登陆的人可以看,我们还期望对应的销售只能看到自己的客户。
因为之前的客户模型里没有对应的负责人或者说销售,所以我们需要修改一下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'
]
这样的话,就没有问题了。
