запрос в поле manyToMany с related_name - PullRequest
2 голосов
/ 19 февраля 2020

мои модели:

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 в модель категории вместо модели курса


мой вопрос: как мне выполнить поиск по CourseRun по id категории

что-то вроде этого:

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

1 Ответ

4 голосов
/ 19 февраля 2020

Если вы установите related_query_name [Django -doc] , то это имя следует использовать при обратной фильтрации. Если вы установите related_name [Django -doc] , а не related_query_name, тогда Django будет использовать related_name для related_query_name как хорошо. Если вы не установите related_name и related_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])
...