Как работать с отношениями в Django

Взаимосвязи становятся действительно сложными, если у вас есть бэкенд, управляющий данными, с большим количеством данных, которые нужно обрабатывать с помощью взаимосвязей. Этот пост поможет вам избавиться от этого жаргона.

В 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

Оцените статью
devanswers.ru
Добавить комментарий