使用 related_name 查询 manyToMany 字段

query on manyToMany field with related_name

我的模特:

class Course(models.Model):
    pass

class CourseRun(models.Model):
    course = models.ForeignKey(Course, related_name='course_runs')

class Category(models.Model):
    courses = models.ManyToManyField(Course, related_name='category_set')

出于某种原因,我不得不在类别模型而不是课程模型中添加 many2many


我的问题: 我如何按类别 ID

在 CourseRun 上搜索

像这样:

CourseRun.objects.filter(course__category__in=[1, 2])

如果您设置 related_query_name [Django-doc], then that is the name you should use when filtering in reverse. If you set the related_name [Django-doc],而不是 related_query_name,那么 Django 也会使用 related_name 作为 related_query_name。如果你不设置 related_namerelated_query_name,那么 related_name 将默认为 <i>modelname</i>_set (所以这里 category_set) 和 related_query_name<i>modelname</i> (所以这里 category).

选项 1:使用 related_name

因此您可以在查询中使用 related_name 进行过滤:

CourseRun.objects.filter(course__<b>category_set</b>__in=[1, 2])

选项 2:设置 related_query_name

另一种选择是将 related_query_name 设置为其他值,例如 'category':

class Category(models.Model):
    courses = models.ManyToManyField(
        Course,
        related_name='category_set',
        <b>related_query_name='category'</b>
    )

然后你可以过滤:

CourseRun.objects.filter(course__<b>category</b>__in=[1, 2])