基于当前用户ID查询家庭成员的Django REST Framework实现求助
实现当前用户的家庭成员查询功能
我来帮你搞定这个需求,咱们一步步调整代码,确保只有当前登录用户能查询到自己的家庭成员,同时修复现有代码里的小问题。
1. 修正Family模型的外键配置
首先,Django 3.0+ 要求外键必须指定 on_delete 参数,另外加上 related_name 可以方便后续反向查询用户的家庭成员,修改后的Family模型如下:
class Family(models.Model): # 添加on_delete和related_name,确保外键关联逻辑正确 userId = models.ForeignKey(MyUser, on_delete=models.CASCADE, related_name='family_members') relationship = models.CharField(max_length=100) first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) gender = models.CharField(max_length=6, blank=True, null=True)
2. 调整Family序列化器(可选优化)
如果希望用户创建家庭成员时不需要手动传入userId(由系统自动关联当前用户),可以把userId设为只读字段:
class FamilySerializer(serializers.ModelSerializer): class Meta: model = Family fields = ('id', 'userId', 'first_name', 'last_name', 'gender', 'relationship') read_only_fields = ('userId',) # 标记为只读,创建时由系统自动赋值
3. 重构FamilyViewSet核心逻辑
这是实现需求的关键,我们需要:
- 限制只有登录用户能访问自己的家庭成员
- 重写查询集,只返回当前用户的家庭成员
- 创建家庭成员时自动关联当前用户
修改后的FamilyViewSet代码:
from rest_framework.permissions import IsAuthenticated class FamilyViewSet(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] # 仅允许登录用户访问 serializer_class = FamilySerializer def get_queryset(self): # 过滤出当前登录用户的所有家庭成员 return Family.objects.filter(userId=self.request.user) def perform_create(self, serializer): # 创建时自动将当前用户绑定到Family记录的userId字段 serializer.save(userId=self.request.user)
为什么要删掉原来的代码?
你原来的FamilyViewSet里的get_object和perform_update存在逻辑问题:
get_object返回self.request.user不符合设计逻辑,这个方法本来是用来获取单个Family实例的perform_update里的CurrentFamilyView未定义,而且激活邮件的逻辑是针对用户模型的,和家庭成员无关,所以直接删掉这些错误代码即可。
测试效果
现在当用户登录后,请求Family的列表接口(比如/api/family/),就只会返回该用户添加的所有家庭成员;创建家庭成员时,系统会自动把当前用户作为userId关联进去,不需要手动传参。
内容的提问来源于stack exchange,提问作者Jin Nii Sama
相关产品推荐
相关产品推荐

