Ответ 1
Если все, что вы хотите сделать, это создать облако тегов, которое должно быть достаточным. Я бы сделал одну модификацию:
tags = models.ManyToManyField(Tag,related_name='photos')
Это сделает обратный поиск в ваших фотографиях более чистым, чтобы читать и легче запомнить.
Однако я бы рассмотрел другие варианты использования ваших тегов. Облако тегов - единственное, для чего вы хотите использовать тегирование? Есть ли метаданные, которые должны содержать отношения?
Если вы планируете иметь миллионы строк, то кэширование будет таким же важным, как модель данных.
Кроме того, чтобы избежать повторного использования колеса, посмотрите, кто-то еще создал библиотеку, которая служит вашим целям: http://www.djangopackages.com/grids/g/tagging/
Изменить: правописание