Django - понятие о связи таблиц
Допустим, в Django я хочу создать 3 модели баз данных Comment, Post и User. Хочу, чтобы к одному посту могли быть прикреплены несколько комментариев и у одного юзера могло быть несколько комментариев. Но у одного комментария не могло быть разных постов и юзеров. Нужно ли мне в таком случае использовать ForeignKey или ManyToManyFild?
class User(models.Model):
name = models.CharField(max_length = 30)
register_date = models.DateField(auto_now_add = True)
class Сomment(models.Model):
text = models.TextField()
author = models.ForeignKey(User, on_delete = models.CASCADE)# или ManyToManyField
data = models.DateField(auto_now_add = True)
class Post(models.Model):
text = models.TextField()
name = models.CharField(max_length = 200)
pub_date = models.DateField(auto_now_add = True)
comments = models.ManyToManyField(Сomment)# или ForeignKey
like = models.IntegerField()
Ответы (1 шт):
В этом случае ManyToManyField не подходит, так как такой тип поля нужен для моделирования ситуации, когда один комментарий может относиться к нескольким постам и у одного поста может быть несколько комментариев.
Нужно использовать ForeignKey:
class Comment(models.Model):
text = models.TextField()
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
# параметр related_name нужен, если хотите
# чтобы из модели User можно было достать все комментарии
related_name='comments',
#если коллекция комментариев в User не нужна - укажите
# вместо имени '+' как в следующей строке
#related_name='+',
)
post = models.ForeignKey(
Post,
on_delete=models.CASCADE,
related_name='comments'
)
data = models.DateField(auto_now_add = True)
class Post(models.Model):
text = models.TextField()
name = models.CharField(max_length = 200)
pub_date = models.DateField(auto_now_add = True)
like = models.IntegerField()
Обратите внимание, что в Post не создаем поля для comments. Это поле создается, используя атрибут related_name на поле ForeignKey в Comment. Доставать коментарии данного поста можно так:
post = ... # как-то нашли пост
comments = post.comments.all()