Django进行ORM查询

时间:2017-12-07 11:10:34

标签: python django orm model

class Task(models.Model):
    subject = models.CharField(max_length=256)
    description = models.TextField(max_length=1024)
    reward = models.PositiveIntegerField()
    begin_date = models.DateField()
    number_of_people = models.PositiveIntegerField(default=1)

class TaskDetail(models.Model):
    user = models.ForeignKey(User, related_name='tasks')
    task = models.ForeignKey(Task, related_name='tasks')

这是我设计的一个简单的任务分配系统模型。 我有一个问题。我尝试制作一个用户报告,其中包括用户已完成的任务数量。但我不知道如何进行ORM查询。

users = User.objects.all

有谁知道如何解决这个问题? THX

3 个答案:

答案 0 :(得分:0)

无需在related_name模型中为user列添加TaskDetail列。 使用foreign_key,无需构建其他查询。您可以使用链概念:

users = User.objects.all()
task_details = TaskDetail.objects.filter(user=users)
for task_detail in task_details:
    subject = task_detail.task.subject

答案 1 :(得分:0)

我们假设您正在尝试计算id=1用户已完成的任务。

the_user = User.objects.filter(id=1)  # Does not hit the database
data = TaskDetail.objects.filter(user__in=the_user) # It selects all tasks by the user
result = data.count()  #It hits the database to count
print(result)

以下是相关的docs

但是,您可以只使用一个表 - 如果这是完整的布局 - 并将user ForeignKey作为Task放入表ManyToManyField

你构建它的方式,可能有杂乱的任务,因为用户忘记将任务分配给自己。

答案 2 :(得分:0)

你可以通过2种方式做到这一点(有一些差异):

1.get

users = User.objects.get(username = "jack" and email= "jack@gmail.com")

注意:在此示例中,我们有usernamepassword字段

2.filter

users = User.objects.filter(username = "jack")

差异

<{1>}使用

中的

您可以使用filter.exists().count().first()(以及其他一些查询)

例如:

.last()

它会显示帖子的拥有者名称为posts_count = Post.objects.filter(owner="jack").count()

jack中的

,您无法使用get.exists().count().first()(以及其他查询)