Как правильно оформить мои модели для лайков?
Требование простое. Залогиненные пользователи могут лайкнуть пост и количество лайков увеличивается на 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
.