Попробуйте что-то вроде:
# models.py
class Gallery(models.Model):
name = models.CharField(max_length=30)
description = models.CharField(max_length=200, null=True)
images = models.ManyToMany(Image)
class Image(models.Model):
title = models.CharField(max_length=30)
caption = models.CharField(max_length=200, null=True)
image = models.ImageField(upload_to=SOMEPLACE_FOR_MEDIA)
Отсюда вы сможете делать такие вещи, как:
image = Image.objects.get(title="Girl Holding Cheese")
related_galleries = image.gallery_set.all()
или что-то подобное, если нужно, чтобы получить то, что вы хотите.То же самое идет в другую сторону.Чтобы вытащить все изображения из галереи, вы должны сделать
gallery = Gallery.objects.get(name="Cheesy Wimmin")
related_images = gallery.images.all()
Хотя назначения в конце не нужны, я обычно просто передаю gallery.images.all () или image.gallery_set.all () напрямую,Обратите внимание на "_set" в конце ссылки от объекта, который не содержит определение M2M.
В отношении прямого использования вы можете сделать составные ссылки, такие как
Image.objects.get(title="Girl Holding Cheese").gallery_set.all()
также, но вы должны решить, когда это сделает код более ясным и лаконичным, а когда просто затруднит чтение в дальнейшем.
Надеюсь, это направит вас в правильном направлении.
Обновление
В своем комментарии ниже вы заметили, что вы не можете сделать
images = Images.objects.filter(gallery_set="Cheesy Wimmins")
related_galleries = images.gallery_set.all()
Это потому, что вы пытаетесь фильтровать () или все () в наборе запросов, а не индивидуальная модель.Поэтому, чтобы это работало, вы можете использовать цикл for в своем шаблоне.Что-то вроде
# views.py
galleries = Gallery.objects.all()
return render(request, 'some/template.html', {'galleries': galleries})
А потом
<!-- templates/some/template.thml -->
{% for gallery in galleries %}
<div class="gallery">
<h2>{{ gallery.name }}</h2>
{% for item in gallery.images.all %}
<div class="image">
{{ item.image }}
</div>
{% endfor %}
</div>
{% endfor %}
или что-то в этом роде.Конечно, вам нужно выполнить все необходимые шаги форматирования, чтобы это выглядело правильно, но это способ получить ваши данные.