I am working on a social media project where users can follow each other. Here are the models that are relevant to this problem
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",
)
I am creating data redundancy for scalability by storing the followers and followings counts instead of calculating it by using UsersFollows
model. So I am using Django’s transaction to add a follower for atomicity.
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()
But during the testing, the user to its followers and followings set is appearing empty.
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())
I tried saving both the User
instances. I also tried saving the UserFollow
instance just in case the create function did not save it automatically.
umuf.UsersFollows.objects.create(
follower=user,
following=followed_user,
).save()
user.save()
followed_user.save()
I don’t get what am I missing here.