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

Django model query with Foreign key and get logged in user

您好,我正在尝试将“字段”添加到我的 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 对象的总和的组合,以便我可以对其进行计算,我该怎么做?

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

谢谢

编辑:这行得通吗?

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']

不过我好像漏掉了什么。

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

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

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

from django.db.models import Sum

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

将检索 Projecttotaluser=request.user 的总和,如果没有与 [=] 相关的项目,这将是 None 17=] 完全没有。

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']

Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].