Взаимосвязи становятся действительно сложными, если у вас есть бэкенд, управляющий данными, с большим количеством данных, которые нужно обрабатывать с помощью взаимосвязей. Этот пост поможет вам избавиться от этого жаргона.
В django есть много способов сделать что-то одно. Один из них — это способ, основанный на собственном мнении, а другие способы — это выбоины, на которые следует обратить внимание. Итак, мы обсудим случаи использования этих отношений. Поехали.
Внешние ключи и обратные аксессоры.
Если вам приходилось видеть ошибку при выполнении такого типа кода в Django.
class Post(models.Model):
sender = models.ForeignKey(User, on_delete=models.CASCADE)
receiver = models.ForeignKey(User, on_delete=models.CASCADE)
Ошибка должна гласить: «Обратный аксессор для ‘Post.sender’ конфликтует с обратным аксессором для ‘Post.receiver'».
Дело в том, что django не знает, как получить доступ к созданным пользователем постам (т.е. постам, отправителем которых он является) и как получить доступ к полученным постам (т.е. постам, получателем которых он является).
Чтобы разрешить эту путаницу, лучше всего добавить аргумент related_name. Это позволит вам получить доступ к полученным и отправленным сообщениям пользователя.
class Post(models.Model):
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sentposts')
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receivedposts')
Таким образом, вы можете получить доступ к отправленным и полученным сообщениям через
alan = User.objects.get(pk=1) #Got the user
posts_sent = alan.sentposts #Got the posts!!
подробнее об этом здесь
Отношения «один к одному» и нелегальные аккаунты
Предположим, у вас есть хорошее приложение, похожее на twitter, вы хотите добавить больше функциональности пользователю, возможно, дать ему собственную фотографию профиля, биографию и все, что вы хотите иметь профиль для него. Поэтому вы делаете следующее:
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="profile")
bio = models.CharField(max_length=400)
Здесь все выглядит хорошо, но это большая ошибка.
Эта ошибка отмечает разницу между всеми этими соединениями.
Здесь вы хотите, чтобы профиль был связан не только с пользователем, но и с уникальным пользователем. Здесь, по крайней мере теоретически, у пользователя может быть другой профиль, который точно так же принадлежит ему. Вы можете остановить это во фронтенде, но какой в этом смысл, если вы можете остановить это в бэкенде. Чтобы у пользователя был профиль, вы можете сделать следующее.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
bio = models.CharField(max_length=400)
Это сэкономит ваше время, ваш мозг и ваше приложение.
Подробнее об этом здесь
Многие ко многим полям и технический жаргон
Предположим, вам нужно приложение для книжной библиотеки. Книга может быть написана многими авторами, и автор также может написать много книг. Отношения «один к одному» не будут работать, как и иностранный ключ, потому что, в конце концов, это просто свойство, как и почта может иметь одного отправителя и получателя, что понятно, многие люди делают посредника, как это -:
class Author_list(models.Model):
Author1 = models.ForeignKey(User, related_name="author1")
Author2 = models.ForeignKey(User, related_name="author2"
class Book(models.Model):
author = models.ForeignKey(Author_list)
Как вы можете видеть, этот метод может вместить только несколько авторов, а что делать, если у книги всего один автор? Может быть, установить несколько параметров в значение null, а затем попробовать. Этот метод уязвим для многих проблем, связанных с масштабом. Вместо этого просто используйте отношение Many To Many.
Разница между ним и Foreign Key заключается в том, что Foreign хранит одно значение как столбец в вашей базе данных, а это хранит целый список. Подумайте об этом как о списке пользователей, которые написали свой шедевр.
class Book(models.Model):
author = models.ManyToMany(User, related_name="books")
Больше информации об этом здесь
Заключение
Надеюсь, вам понравилось читать этот пост. Желаю вам много счастья в ваших отношениях с django.
Изображение на обложке от Tú Anh с Pixabay