Фильтр по полю 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'
.