使用外键查询 Django 模型并获取登录用户

Posted

技术标签:

【中文标题】使用外键查询 Django 模型并获取登录用户【英文标题】:Django model query with Foreign key and get logged in user 【发布时间】:2021-03-11 18:56:27 【问题描述】:

您好,我正在尝试将“字段”添加到我的 django 项目中,这些项目将根据查询进行计算..

基本上我有 2 个模型,一个是抽象用户的扩展用户

class CustomUser(AbstractUser):
    pass

我的主要模型是项目

class Project(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(CustomUser, on_delete=models.PROTECT, editable=False)
    name = models.CharField(max_length=20, editable=False)
    total = models.DecimalField(max_digits=6, decimal_places=2, editable=False)
    created = models.DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)
    this_month = datetime.datetime.now().month
    allprojectsthismonth = Project.objects.filter(created__month=this_month)

    def __str__(self):
        return self.name

我使用此视图通过 Web 表单创建项目对象:

def homepage(request):
    if request.method == "POST":
        project = Project()
        name = request.POST.get('name')
        total = request.POST.get('total')
        created = datetime.datetime.now()
        user = request.user
        project.user = user
        project.name = name
        project.total = total
        project.created = created
        project.save()
        
        #return HttpResponse(reverse("homepage.views.homepage"))
        return render(request, 'homepage.html')
    else:

        return render(request, 'homepage.html')

我现在需要的是有一个查询集,它可以让我得到给定用户项目对象的总组合,以便我可以对其进行计算,我将如何去做?

理想情况下,我会获得已登录的用户,然后我可以将所有 Project.object.total 与 user = 当前已登录的总和添加到我的视图中。

谢谢

编辑:这行得通吗?

class Project(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(CustomUser, on_delete=models.PROTECT, editable=False)
name = models.CharField(max_length=20, editable=False)
total = models.DecimalField(max_digits=6, decimal_places=2, editable=False)
created = models.DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)
this_month = datetime.datetime.now().month
projectsthismonth = self.objects.filter(created__month=this_month)

def monthlyTotal(self,request):
    projectsthismonth.objects.filter(
        user=request.user
    ).aggregate(
        sum_total=Sum('total')
    )['sum_total']

我似乎错过了什么。

【问题讨论】:

您使用CustomUser 作为用户模型(在AUTH_USER_MODEL 中)? 是的,我的用户模型和项目一样工作,它现在只是添加了功能 【参考方案1】:

您可以获得Projects的查询集,其中用户是登录用户:

Project.objects.filter(<b>user=request.user</b>)

如果您想进行简单的聚合(如 sum、count 等),您最好使用.aggregate(…) [Django-doc],因为那时计算是在数据库级别完成的。例如:

from django.db.models import Sum

Project.objects.filter(
    user=request.user
).aggregate(
    sum_total=Sum('total')
)['sum_total']

将检索Projects 与user=request.usertotals 之和,如果根本没有与user 相关的项目,这将是None

from django.utils.timezone import now

class Project(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(CustomUser, on_delete=models.PROTECT, editable=False)
    name = models.CharField(max_length=20, editable=False)
    total = models.DecimalField(max_digits=6, decimal_places=2, editable=False)
    created = models.DateTimeField(auto_now_add=True)
    
    def monthlyTotal(self,user):
        this_month = now().month
        return Project.objects.filter(
            created__month=this_month,
            user=user
        ).aggregate(
            sum_total=Sum('total')
        )['sum_total']

注意:您可以使用 @login_required decorator [Django-doc].

【讨论】:

谢谢你!那么我会直接将我的查询集写入视图吗?还是型号? @ThiMar:如果特定于视图中的视图。如果你会在多个视图中使用相同的逻辑,那么它就属于模型层。 我为我的模型添加了一个编辑,不确定我是否做对了。感谢您的帮助 @ThiMar:不,通过在类级别使用this_month,它只会在类被解释时被评估,所以如果你的服务器今天启动,两天后它仍然会使用 11 月。此外,模型通常是request-unaware,因此您使用user 作为参数,而不是request 非常感谢您的解释,这对我来说现在更有意义了,我为这个项目找到了前进的道路。非常感谢。

以上是关于使用外键查询 Django 模型并获取登录用户的主要内容,如果未能解决你的问题,请参考以下文章

Django:通过外键查询获取 User.usernames

Django将登录的登录用户保存为外键

在main函数中使用django模型(附django正反向的外键关联查询)

Django:查询多个外键

Django - 显示结果信息,同时使用具有多个外键关系的模型优化数据库查询

如何使用 Django 模型在 ExtJS 网格中获取外键值而不是键?