Ваше первое утверждение верно, для ManyToManyField"у объекта A много объектов B, поэтому у объекта B много объектов A"
Обратите внимание, что при определении
class Comment(models.Model):
text = models.TextField(max_length = 300)
author = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add = True)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique = True)
comments = models.ManyToManyField(Comment)
Существует неявный вид ManyToManyField, определенный для Comment для UserProfile, например
class Comment(models.Model):
text = models.TextField(max_length = 300)
author = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add = True)
userprofiles = models.ManyToManyField(UserProfile)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique = True)
Фактически вы можете определить таблицу «многие ко многим» в любом случае.
Как вы уже заметили, определение вашей модели не работает с двумя ManyToManyFields . То, что вы хотите использовать, - это GenericForeignKey , который может присоединять что угодно к чему-либо еще (именно так работает структура комментирования IIRC).
Что-то вроде
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
class Comment(models.Model):
text = models.TextField(max_length = 300)
author = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add = True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')