Фильтр по полю ManyToManyField, один способ

У меня есть модель с полем ManyToManyField:

class Release(models.Model):
    #...
    bundled_releases = models.ManyToManyField("self", blank=True)

    def get_bundles(self):
        return Release.objects.filter(bundled_releases__in=[self.id])

Я хочу, чтобы get_bundles возвращал только релизы, имеющие self в полях bundled_releases, но таким образом, чтобы он также возвращал релизы в поле self в bundled_releases. Как это сделать?

Your relation is symmetrical, that is the problem. By default relations to itself have symmetrical=True [Django-doc]. So that means that my_a.bundled_releases.all() is the same as my_a.release_set.all().

Таким образом, вы работаете с:

class Release(models.Model):
    # …
    bundled_releases = models.ManyToManyField(
        'self', symmetrical=False, related_name='bundles', blank=True
    )

Однако нет никакой необходимости делать .get_bundles(…) метод. Django делает отношения доступными в двух направлениях. Здесь вы можете вызвать отношение в обратном направлении с помощью:

my_release.bundles.all()

Это из-за related_name='bundles'.

Вернуться на верх