Как сохранить экземпляр дочернего набора в родительском объекте в отношениях "многие к одному" (Foreign Key) в Django?

Я работаю над проектом социальной сети, в которой пользователи могут следить друг за другом. Вот модели, которые имеют отношение к этой проблеме

django.contrib.auth.models.User
class UsersProfiles(ddm.Model):
    user = ddm.OneToOneField(
        dcam.User,
        on_delete=ddm.CASCADE,
        related_name="profile",
    )
    followers_count = ddm.IntegerField(default=0)
    followings_count = ddm.IntegerField(default=0)
class UsersFollows(ddm.Model):
    follower = ddm.ForeignKey(
        dcam.User,
        on_delete=ddm.CASCADE,
        related_name="followers",
    )
    following = ddm.ForeignKey(
        dcam.User,
        on_delete=ddm.CASCADE,
        related_name="followings",
    )

Я создаю избыточность данных для масштабируемости, храня количество последователей и подписчиков вместо того, чтобы вычислять его с помощью модели UsersFollows. Поэтому я использую транзакцию Django для добавления последователя для атомарности.

with ddt.atomic():
    umuf.UsersFollows.objects.create(
        follower=user,
        following=followed_user,
    )
    followed_user.profile.followers_count += 1
    user.profile.followings_count += 1
    followed_user.profile.save()
    user.profile.save()

Но во время тестирования пользователь в наборе последователей и подписчиков отображается пустым.

def test_valid(self):
    response = self.client.post(
        c.urls.USERS_1_FOLLOWINGS,
        {"user": 2},
        headers=h.generate_headers(self.login_response),
    )
    h.assertEqualResponses(response, c.responses.SUCCESS)
    user1 = dcam.User.objects.get(pk=1)
    user2 = dcam.User.objects.get(pk=2)
    self.assertEqual(user1.profile.followings_count, 1)
    self.assertEqual(user2.profile.followers_count, 1)
    follow = umuf.UsersFollows.objects.filter(
        follower=user1,
        following=user2,
    )
    self.assertEqual(len(follow), 1)
    # Below 2 assertions are failing
    self.assertIn(user1, user2.followers.all())
    self.assertIn(user2, user1.followings.all())

Я попробовал сохранить оба экземпляра User. Я также попробовал сохранить экземпляр UserFollow на случай, если функция создания не сохранит его автоматически.

umuf.UsersFollows.objects.create(
    follower=user,
    following=followed_user,
).save()
user.save()
followed_user.save()

Я не понимаю, что я здесь упускаю.

class UsersFollows(ddm.Model):
    follower = ddm.ForeignKey(
        dcam.User,
        on_delete=ddm.CASCADE,
        related_name="followings", # this was "followers"
    )
    following = ddm.ForeignKey(
        dcam.User,
        on_delete=ddm.CASCADE,
        related_name="followers", # this was "followings"
    )

Я перевернул имена последователей. Пользователь-последователь получает доступ к своим последователям, а пользователь-последователь - к своим последователям

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