Django - 过滤外键属性
Posted
技术标签:
【中文标题】Django - 过滤外键属性【英文标题】:Django - filtering on foreign key properties 【发布时间】:2010-12-31 04:36:20 【问题描述】:我正在尝试根据 ForeignKey
的特定字段的值过滤 Django 中的表。
例如,我有两个模型:
class Asset(models.Model):
name = models.TextField(max_length=150)
project = models.ForeignKey('Project')
class Project(models.Model):
name = models.TextField(max_length=150)
我想根据关联项目的名称过滤我的资产列表。
目前,我正在执行 两个 查询:
project_list = Project.objects.filter(name__contains="Foo")
asset_list = Asset.objects.filter(desc__contains=filter,
project__in=project_list).order_by('desc')
我想知道是否有办法在主查询中指定这种过滤?
【问题讨论】:
我很困惑,project__in=project_list
是否应该是 Project__in=project_list
(是否区分大小写),因为您在模型中分配了 Project
【参考方案1】:
Asset.objects.filter( project__name__contains="Foo" )
【讨论】:
谢谢,我试过了,但显然我忘记使用双下划线了。 是否需要包含?? @DeadDjangoDjokercontains
描述了 django ORM 生成的查询中使用的比较类型,sql 可能看起来像 LIKE '%Foo%'
。【参考方案2】:
自从 queryset-refactor
分支在 1.0 之前登陆以来,这已经成为可能。 Ticket 4088 暴露了问题。这应该有效:
Asset.objects.filter(
desc__contains=filter,
project__name__contains="Foo").order_by("desc")
Django Many-to-one documentation 有这个和其他使用模型 API 跟踪外键的示例。
【讨论】:
这是否会命中数据库两次,我应该使用 select_related() 来使其更优化吗? 你可以添加一个 .query.as_sql() 来查看实际会执行什么 sql。 指向 django 文档的链接已完全过时,并出现在“已删除 410 页面”上:-/【参考方案3】:student_user = User.objects.get(id=user_id)
available_subjects = Subject.objects.exclude(subject_grade__student__user=student_user) # My ans
enrolled_subjects = SubjectGrade.objects.filter(student__user=student_user)
context.update('available_subjects': available_subjects, 'student_user': student_user,
'request':request, 'enrolled_subjects': enrolled_subjects)
在我上面的应用程序中,我假设一旦学生注册,将创建一个主题 SubjectGrade 实例,其中包含注册的主题和学生本人。
Subject 和 Student User 模型是 SubjectGrade 模型的外键。
在“available_subjects”中,我通过检查所有具有“student”属性的subjectgrade实例作为当前student_user,排除了当前student_user已经注册的所有科目
PS。如果由于我的解释您仍然无法理解,请提前道歉。这是我能提供的最好的解释。非常感谢你
【讨论】:
以上是关于Django - 过滤外键属性的主要内容,如果未能解决你的问题,请参考以下文章