Django - 过滤外键属性

16 浏览
0 Comments

Django - 过滤外键属性

我想在Django中基于ForeignKey字段的特定值对表进行筛选。\n例如,我有两个模型:\n

class Asset(models.Model):
    name = models.TextField(max_length=150)
    project = models.ForeignKey('Project')
class Project(models.Model):
    name = models.TextField(max_length=150)

\n我想根据关联项目的名称来筛选我的资产列表。\n目前,我执行两个查询:\n

project_list = Project.objects.filter(name__contains="Foo")
asset_list = Asset.objects.filter(desc__contains=filter,
                                  project__in=project_list).order_by('desc')

\n我想知道是否有一种方法可以在主查询中指定这种类型的筛选?

0
0 Comments

问题的出现原因:在这段代码中,通过使用exclude()函数来获取未被当前学生用户(student_user)所选修的课程(available_subjects),而被选修的课程(enrolled_subjects)通过filter()函数来获取。这里的问题是无法正确使用exclude()函数来过滤外键属性。

解决方法:在这种情况下,可以使用双下划线(__)来访问外键属性。修改代码如下:

student_user = User.objects.get(id=user_id)
available_subjects = Subject.objects.exclude(subject_grade__student__user__id=student_user.id)
enrolled_subjects = SubjectGrade.objects.filter(student__user__id=student_user.id)
context.update({'available_subjects': available_subjects, 'student_user': student_user, 
                'request':request, 'enrolled_subjects': enrolled_subjects})

使用双下划线(__)来访问外键属性,可以正确地过滤出未被当前学生用户所选修的课程。

0
0 Comments

这是一个关于Django中过滤外键属性的问题。问题的出现是因为在queryset-refactor分支在1.0之前就已经实现了这个功能。Ticket 4088揭示了这个问题。解决方法如下:

Asset.objects.filter(
    desc__contains=filter,
    project__name__contains="Foo").order_by("desc")

你可以在Django的Many-to-one文档中找到这个例子以及其他关于使用Model API跟随外键的例子。

这个查询会对数据库进行两次查询吗?我应该使用select_related()来使得查询更优化吗?

你可以添加.query.as_sql()来查看实际执行的SQL语句。

Django文档的链接已经过时了,跳转到了一个'410 Page removed'的页面。

0
0 Comments

Django - 过滤外键属性的问题及解决方法

在Django中,我们可以使用filter()方法对数据库进行查询,通过指定条件来过滤出符合要求的数据。然而,有时候我们需要对外键属性进行过滤,即通过外键关联的其他模型的属性来进行查询。下面我们来看一下一个关于Django过滤外键属性的问题以及解决方法。

问题的出现原因是在进行外键属性过滤时,作者忘记使用双下划线来指定属性的路径。具体来说,作者想要通过过滤项目(project)模型的名称属性(name)来查询资产(Asset)模型的数据,代码如下:

Asset.objects.filter( project__name__contains="Foo" )

然而,作者忘记了在project和name之间使用双下划线进行关联,导致查询结果不符合预期。在得到这个问题的回答后,作者认识到了这个错误。

解决方法是在外键属性过滤时,需要使用双下划线来指定属性的路径。在上述代码中,使用双下划线将项目模型的名称属性与资产模型进行关联,代码如下:

Asset.objects.filter( project__name__contains="Foo" )

这样,就可以正确地通过外键属性进行过滤查询了。值得注意的是,contains是一种查询的比较方式,它会将查询条件转化为类似于LIKE '%Foo%'的SQL语句。

通过这个问题和解决方法的整理,我们可以更好地理解在Django中如何过滤外键属性,并且避免类似的错误。在使用filter()方法进行查询时,需要注意使用双下划线来指定属性的路径,以确保查询结果符合预期。

0