使用 related_name 查询 manyToMany 字段

ehs*_*adi 3 django django-models django-queryset

我的模型:

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')
Run Code Online (Sandbox Code Playgroud)

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


我的问题:如何按类别 ID 在 CourseRun 上搜索

像这样的东西:

CourseRun.objects.filter(course__category__in=[1, 2])
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

如果您设置了related_query_name[Django-doc],那么这就是您在反向过滤时应该使用的名称。如果你设置了related_name[Django-doc],而不是 a related_query_name,那么 Django 也会使用related_namefor related_query_name。如果不设置related_nameand related_query_namerelated_name则将默认为modelname_set(so here category_set) and related_query_nameto modelname(so here category)。

选项 1:使用 related_name

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

CourseRun.objects.filter(course__category_set__in=[1, 2])
Run Code Online (Sandbox Code Playgroud)

选项 2:设置一个 related_query_name

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

class Category(models.Model):
    courses = models.ManyToManyField(
        Course,
        related_name='category_set',
        related_query_name='category'
    )
Run Code Online (Sandbox Code Playgroud)

然后你可以过滤:

CourseRun.objects.filter(course__category__in=[1, 2])
Run Code Online (Sandbox Code Playgroud)