使用外键查询 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']
不过我好像漏掉了什么。
您可以获取 Project
s 的查询集,其中用户是登录用户:
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']
将检索 Project
的 total
与 user=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].
您好,我正在尝试将“字段”添加到我的 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']
不过我好像漏掉了什么。
您可以获取 Project
s 的查询集,其中用户是登录用户:
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']
将检索 Project
的 total
与 user=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].