- en
- Language: ru
- Documentation version: 2.0
3. Как смоделировать отношения «многие ко многим»?
Отношения «многие ко многим» - это отношения между таблицами в базе данных, когда родительская строка в одной таблице содержит несколько дочерних строк во второй таблице, и наоборот.
Чтобы сделать его более интерактивным, мы поговорим о приложении для Twitter. Используя всего несколько полей и поле ManyToMany, мы можем создать простое приложение для Twitter.
У нас есть 3 основные вещи в Twitter: твиты, подписчики, избранное/не избранное.
У нас есть две модели, чтобы все работало. Мы наследуем auth_user от django.:
class User(AbstractUser):
tweet = models.ManyToManyField(Tweet, blank=True)
follower = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)
pass
class Tweet(models.Model):
tweet = models.TextField()
favourite = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='user_favourite')
def __unicode__(self):
return self.tweet
Что сможет сделать вышеупомянутая модель?
1) User will able to follow/unfollow other users.
2) User will able to see tweets made by other users whom user is following.
3) User is able to favorite/unfavorite tweets.
Несколько операций с использованием поля ManyToManyfield, которые могут быть выполнены::
>>> t1 = Tweet(tweet="I am happy today")
>>> t1.save()
>>> t2 = Tweet(tweet="This is my second Tweet")
>>> t2.save()
>>> u1 = User(username='johny1', first_name='Johny', last_name='Smith', email='johny@example.com')
>>> u1.save()
>>> u2 = User(username='johny1', first_name='Johny', last_name='Smith', email='johny@example.com')
>>> u2.save()
>>> u3 = User(username='someuser', first_name='Some', last_name='User', email='some@example.com')
>>> u3.save()
Мы создали несколько твитов и несколько пользователей, которые до сих пор не использовали поле M2M. Продолжим связывать их на следующем этапе.:
>>> u2.tweet.add(t1)
>>> u2.save()
>>> u2.tweet.add(t2)
>>> u2.save()
// User can follow other users.
>>> u2.follow.add(u1)
>>> u2.save()
// Tweets are linked to the users. Users have folloewd each other. Now we can make users do favourite/unfavourite of the tweets.
>>> t1.favourite.add(u1)
>>> t1.save()
>>> t1.favourite.add(u3)
>>> t1.save()
// For removing any users vote
>>> t1.favourite.remove(u1)
>>> t1.save()
Рабочий пример можно найти в репозитории: https://github.com/yashrastogi16/simpletwitter.