Когда использовать каждое отношение модели в 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?

  1. Should Watchlist.item be a ForeignKey? Or is M2M correct?
  2. Wouldn't it simplify to make the 'Watchlist' part of the User class? (give them an empty list to populate with listing ID's)
  3. 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 и того, как все это работает. В общем, это требует некоторого планирования даже для простого приложения.

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