You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django应用中为PetOwner模型实现身份验证功能

方案合理性判断

仅在PetOwner中添加OneToOneField关联User的方案完全可用,能够满足你的基础需求,不过还有可以优化的细节和更适配你场景的可选方案:

  1. 字段补充建议:给OneToOneField添加related_name="pet_owner"参数,后续你可以直接通过request.user.pet_owner快速拿到当前登录用户对应的PetOwner实例,不用额外写查询逻辑。
  2. 数据同步建议:新增post_save信号量,实现创建User实例时自动创建关联的PetOwner实例、或者创建PetOwner时自动创建对应User实例,避免出现两者关联缺失的问题。
  3. 权限控制实现:你不想让PetOwner拥有admin权限非常容易实现,只要创建关联的User实例时,将is_staff、is_superuser字段默认设为False即可,Django默认的后台仅允许is_staff=True的用户访问,完全满足你的要求。

关于login_required和LoginRequiredMixin的作用

这两个工具的核心作用是校验当前访问用户是否处于登录状态,未登录用户会被自动跳转到登录页。只要用户登录成功,你在视图中就可以直接通过request.user拿到当前登录的User对象,自然也能访问该用户持有的所有权限,完全符合你的预期。

如果你要实现类视图仅展示当前登录用户的宠物,只需要重写类视图的get_queryset方法即可,示例代码如下:

class PetListView(LoginRequiredMixin, generic.ListView):
    model = Pet
    # 假设Pet模型有owner外键关联PetOwner
    def get_queryset(self):
        return super().get_queryset().filter(owner=self.request.user.pet_owner)

更适配你场景的可选方案

因为你要求所有业务用户都对应PetOwner实例,没有其他用户类型,更推荐直接自定义Django用户模型,省去维护OneToOne关联的成本:

  1. 自定义PetOwner继承AbstractUser,Django内置的AbstractUser已经自带了first_name、last_name、email、密码存储、密码哈希等能力,你只需要补充你业务特有的字段即可:
from django.contrib.auth.models import AbstractUser
from django.db import models

class PetOwner(AbstractUser):
    phone_number = models.CharField(max_length=20)
    address = models.TextField()
  1. 在项目settings.py中添加配置:AUTH_USER_MODEL = "你的应用名称.PetOwner",替换Django默认的用户模型。
  2. 后续request.user直接就是PetOwner实例,不需要再做反向关联查询,开发效率更高。

另外不需要你手动处理密码哈希,Django的用户体系会自动完成密码的哈希存储、校验逻辑,你只需要调用set_password(明文密码)方法设置密码、用authenticate(username=xxx, password=xxx)方法校验密码即可,不需要自己实现hash逻辑。

内容的提问来源于stack exchange,提问作者The silent one

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:54:03