Как правильно оформить мои модели для лайков?

Требование простое. Залогиненные пользователи могут лайкнуть пост и количество лайков увеличивается на 1.

Здесь я думаю, что приведенные ниже модели отвечают требованиям, но я хочу получить наилучший возможный дизайн базы данных.

Или могут быть и другие лучшие варианты.

class Post(models.Model):
  title = models.CharField(max_length=255)
  likes = models.ManyToManyField(settings.AUTH_USER_MODEL)

ИЛИ

class Like(models.Model):
  post = models.ForeignKey(Post)
  user = models.ForeignKey(User)

По сути, это одно и то же.

Если вы не указываете through= модель на ManyToManyField, Django создает трехколоночную (id, fk1, fk2) таблицу за кулисами, практически точно такую же, как ваша модель Like (хотя с дополнительным уникальным ограничением на два столбца).

Установка модели through= на поле M2M делает соединение явным, и Django не будет создавать модель за вас:

class Post(models.Model):
  title = models.CharField(max_length=255)
  likes = models.ManyToManyField(settings.AUTH_USER_MODEL, through='myapp.Like')


class Like(models.Model):
  post = models.ForeignKey(Post)
  user = models.ForeignKey(User)

  class Meta:
    unique_together = [('post', 'user')]

Это полезно, если вы хотите, например, хранить время создания понравившегося файла:

class Like(models.Model):
  time = models.DateTimeField(auto_now_add=True)
  post = models.ForeignKey(Post)
  user = models.ForeignKey(User)

Из соображений производительности я бы также рекомендовал добавить поле "кэш" для количества лайков на модели Post.

Вернуться на верх