Как правильно привязать модель с комментариями к разным моделям?

В Django, привязка модели с комментариями к разным моделям может быть реализована с использованием отношений «один ко многим» (OneToMany relationships) и модели-помощника.

Для создания модели комментариев вы можете использовать следующий код:

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey

class Comment(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    text = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

Поле content_type является внешним ключом к модели ContentType, а поле object_id - полем для сохранения идентификатора объекта, к которому привязан комментарий.
content_object является обобщенным внешним ключом (GenericForeignKey), который позволяет ссылаться на модель, указанную в content_type и object_id.

Теперь, когда у вас есть модель комментариев, вы можете связать ее с другими моделями. Например, предположим, что у вас есть модель Article и модель Photo, и вы хотите добавить комментарии к обоим:

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class Photo(models.Model):
    image = models.ImageField(upload_to='photos/')

# Привязываем модель комментариев к моделям статьи и фото
comments = GenericRelation(Comment)

Теперь каждый экземпляр модели Article и Photo будет иметь доступ ко всем своим комментариям через обратную связь с помощью поля comments.

Таким образом, чтобы создать комментарий для конкретного объекта, вы можете сделать следующее:

# Создаем статью
article = Article.objects.create(title='Заголовок статьи', content='Содержимое статьи')

# Создаем комментарий для статьи
comment = Comment.objects.create(content_object=article, text='Это комментарий к статье')

# Создаем фотографию
photo = Photo.objects.create(image=image_file)

# Создаем комментарий для фотографии
comment = Comment.objects.create(content_object=photo, text='Это комментарий к фотографии')

Таким образом, вы можете привязать модель комментариев к разным моделям в Django, используя обобщенный внешний ключ. Это позволяет вам добавлять комментарии для любого объекта в вашем приложении без необходимости создания отдельных таблиц для каждой модели.