Когда использовать каждое отношение модели в Django?
Я уже несколько часов читаю документацию по Django и просматриваю некоторые другие ответы на сайте, но все еще не могу понять, что к чему. Я знаю, что это не специфично для Django, но примеры, которые я использую, будут из проекта Django.
Мой вопрос сводится к тому, когда уместно использовать каждый из них:
- Отношения "многие ко многим"
- Отношения "многие к одному"
- Отношения один-к-одному
Один-к-одному, более или менее имеет смысл для меня.
Теперь о двух других. Хотя я понимаю разницу между ними в отдельности, когда дело доходит до их практического использования в проекте, я прихожу в замешательство. Вот пример:
class User(AbstractUser):
pass
class Listing(models.Model):
title = models.CharField(max_length=64)
description = models.TextField()
class Watchlist(models.Model):
user = models.ForeignKey(User, related_name='watchlist', on_delete=models.CASCADE)
item = models.ManyToManyField(Listing)
class Comment(models.Model):
user = models.ForeignKey(User, related_name='comments', on_delete=models.SET_NULL)
comment = models.TextField()
Будет ли это правильным использованием Many-to-one(ForeignKey) и Many-to-many?
- Should Watchlist.item be a ForeignKey? Or is M2M correct?
- Wouldn't it simplify to make the 'Watchlist' part of the User class? (give them an empty list to populate with listing ID's)
- Why is Watchlist.user not a One-to-one relationship, if each watchlist belongs to a single user, and a user can only have one list?
Прошу прощения за мою тупость, я просто не могу заставить это понять!
Спасибо.
Чтобы объяснить это просто, эти django-модели или объекты представляют собой таблицы в вашей базе данных, а поля подобны столбцам в них. Таким образом, при отношении один-к-одному вы можете иметь только одну строку в одной таблице, относящуюся к одной строке в другой таблице. Например, один пользователь в таблице user (представленный одной строкой) может относиться только к одной строке в таблице profile. Но у пользователя может быть много комментариев, поэтому это будет отношение "один ко многим"/"чужой ключ" (если вы установите unique=true для fk, на практике оно будет работать как 1:1). Если пользователи могут совместно писать комментарии, или, например, как здесь, на stackoverflow, где пользователи могут редактировать комментарии других пользователей, это будет отношение "многие-ко-многим".
Проектирование базы данных может быть сложным/затруднительным, особенно при использовании ORM без базовых знаний SQL и того, как все это работает. В общем, это требует некоторого планирования даже для простого приложения.