首页 > 解决方案 > Django 2.x - 根据关系数据库内容过滤重定向

问题描述

我有一个正在开发的应用程序,它有 2 种类型的用户(A 和 B),我有一个页面,我想重定向未经过身份验证且不是 B 类型的用户。用户类型在关系数据库中设置。

我的两个数据库表是

User - pk, etc... Profile - pk, uid (user pk), account_type

到目前为止我做了什么:

我已经@login_required在我的views.py文档中使用了成功验证身份验证。

我可以过滤手动设置 pid 的内容: Profile.objects.filter(user__pk=1) 并且我可以通过以下方式获取当前用户 IDrequest.user.id

我正在努力解决的问题

我试图做的是创建一个条件,在其中我使用request.user.id过滤器来查找该用户,然后验证帐户类型。我不知道如何拉,account_type此时我的代码变得一团糟,而且可能无效。我已经对此进行了搜索,但是使用此处的关键字找到的所有内容都揭示了与我要解决的问题不同的问题。

编辑了附加信息

我在这里使用了 2 个应用程序,其中 1accounts个是listings,我这样做的页面是用于发布列表,即在listing应用程序中;我只希望一种类型的用户 (B) 能够发布它。

在我的帐户中,我有这个课程:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.CharField(max_length=30, blank=True)
    account_type = models.CharField(max_length=30)

在列表应用程序中,我还没有创建相关模型,我的理解是这种过滤会发生在视图中。

在我正在做的视图中:

@login_required
def post(request):
   current_user = request.user
   if : #here is where I want to filter, but haven't been able to get it to work

   else:
     return redirect('index')

标签: django

解决方案


从您的模型设计开始,如果您的系统具有一个用户只有一个配置文件的标准。然后将 Profile 模型中的 uid 设置为 OnetoOneField 以便您可以轻松访问 account_type User.objects.filter(id=request.user.id).profile.account_type

否则,如果您的系统具有一个用户可以拥有多个配置文件的标准。然后您首先需要访问它的配置文件,并通过添加更多过滤器来选择特定配置文件,然后您访问 account_type:

User.objects.filter(id=request.user.id).profile_set.all()为您提供用户的所有个人资料。

User.objects.filter(id=request.user.id).profile_set.get(your_filter)为您提供用户的特定个人资料。

User.objects.filter(id=request.user.id).profile_set.get(your_filter).account_type使您可以访问特定用户的个人资料的 account_type。

一对一的关系描述在这里

此处为外(多对一)键描述


推荐阅读