Как сохранить экземпляр дочернего набора в родительском объекте в отношениях "многие к одному" (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"
)
Я перевернул имена последователей. Пользователь-последователь получает доступ к своим последователям, а пользователь-последователь - к своим последователям