Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

query on manyToMany field with related_name

my models:

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')

for some reason I was forced to add many2many in Category model instead of Course model


my question: how can I search on CourseRun by category id

somethings like this:

CourseRun.objects.filter(course__category__in=[1, 2])
like image 808
ehsan ahmadi Avatar asked Nov 03 '25 21:11

ehsan ahmadi


1 Answers

If you set the 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], and not a related_query_name, then Django will use the related_name for the related_query_name as well. If you do not set a related_name and related_query_name, then related_name will default to modelname_set (so here category_set) and related_query_name to modelname (so here category).

Option 1: use the related_name

So you can filter with the related_name in your query:

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

Option 2: set a related_query_name

Another option is to set the related_query_name to something else, for example 'category':

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

Then you can filter with:

CourseRun.objects.filter(course__category__in=[1, 2])
like image 54
Willem Van Onsem Avatar answered Nov 06 '25 10:11

Willem Van Onsem



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!