使用外键查询 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】:
您可以获得Project
s的查询集,其中用户是登录用户:
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']
将检索Project
s 与user=request.user
的total
s 之和,如果根本没有与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
在main函数中使用django模型(附django正反向的外键关联查询)