@val1n0r

Как правильно своевременно обновлять данные выводимые context'om?

Все ку.

Есть такая cbv
class StartFight(FightMixin,HeroEquipInfo, UserInfo, View):
    def post(self, request, hero_unique_id, *args,**kwargs):
        uid = request.user.id

        logic_data = super(StartFight, self)
        user_stat_list = logic_data.UserStat(uid)

        context = {}


        context = user_stat_list

        

        it_stat = logic_data.GetItemStat(uid)
        user_hero_power = it_stat['total_power']

        en_list = UserActiveHero.objects.filter(hero_power__lte=user_hero_power)
        context['enemy'] = en_list
        fight_resultat = logic_data.fight_result(uid,hero_unique_id,user_stat_list)
        context['fight_res'] = fight_resultat
        return render(request,'fight.html',context)


Как видно выше - я передаю данные на обработку в миксины "FightMixin,HeroEquipInfo, UserInfo"
Вот основной миксин, который меня интересует
class FightMixin(object):
	def fight_result(self, uid, hero_unique_id, user_stat_list, *args, **kwargs):

		#Статы юзера
		user_hero = UserActiveHero.objects.filter(user_hero_id=uid)
		#Достаем статы противника
		enemy_hero = UserActiveHero.objects.filter(hero_unique_id=hero_unique_id)
		
		if enemy_hero and user_hero:
			#ОПЫТ СЕРЕБРО И ТП
			silver_win_reward = 120
			silver_loose_reward = 50
			xp_win_reward = 25
			xp_loose_reward = 10

			if user_stat_list['xp_buff']:#:
				xp_win_reward = xp_win_reward * 2
				xp_loose_reward = xp_loose_reward * 2



			fight_result_list ={'w_l':None,'xp':None,'silver':None,'drop_portal':None,'fight_color':None,'energy':None}
			for i in enemy_hero:
				enemy_power = i.hero_power

			for u in user_hero:
				user_power = u.hero_power
					# ПОБЕДА
			if user_power > enemy_power and user_stat_list['energy'] >=10:
				#user win
				fight_result_list['energy'] = True
				fight_result_list['w_l'] = 'Победа!'
				fight_result_list['fight_color'] = '#207C1C'
				fight_result_list['xp'] = xp_win_reward
				fight_result_list['silver'] = silver_win_reward
				fight_result_list['drop_portal'] = False

				#Добавляем победные статы
				UserAttribute.objects.filter(user_id=uid).update(silver=F('silver')+250,xp=F('xp')+xp_win_reward,energy=F('energy')-10,
											totalWin=F('totalWin')+1)

				UserActiveHero.objects.filter(user_hero_id=uid).update(hero_xp=F('hero_xp')+20)

				return fight_result_list

					#НИЧЬЯ
			elif user_power == enemy_power and user_stat_list['energy'] >=10:
				res = random.randint(1,4)
				if res == 1 or res == 2:
					#user win
					fight_result_list['energy'] = True
					fight_result_list['w_l'] = 'Победа!'
					fight_result_list['fight_color'] = '#207C1C'
					fight_result_list['xp'] = xp_win_reward
					fight_result_list['silver'] = silver_win_reward
					fight_result_list['drop_portal'] = False
					
					#Добавляем победные статы
					UserAttribute.objects.filter(user_id=uid).update(silver=F('silver')+silver_win_reward,xp=F('xp')+xp_win_reward,energy=F('energy')-10,
											totalWin=F('totalWin')+1)
					UserActiveHero.objects.filter(user_hero_id=uid).update(hero_xp=F('hero_xp')+xp_win_reward)

					return fight_result_list


				else: #Поражение
					fight_result_list['energy'] = True
					fight_result_list['w_l'] = 'Поражение'
					fight_result_list['fight_color'] = '#CB4A3F'
					fight_result_list['xp'] = xp_loose_reward
					fight_result_list['silver'] = silver_loose_reward
					fight_result_list['drop_portal'] = False

					UserAttribute.objects.filter(user_id=uid).update(silver=F('silver')+silver_loose_reward,xp=F('xp')+xp_win_reward,energy=F('energy')-10,
											)
					UserActiveHero.objects.filter(user_hero_id=uid).update(hero_xp=F('hero_xp')+xp_win_reward)

					return fight_result_list


						#ПОРАЖЕНИЕ
			elif user_power < enemy_power and user_stat_list['energy'] >=10:
				fight_result_list['energy'] = True
				fight_result_list['w_l'] = 'Поражение'
				fight_result_list['fight_color'] = '#CB4A3F'
				fight_result_list['xp'] = xp_loose_reward
				fight_result_list['silver'] = silver_loose_reward
				fight_result_list['drop_portal'] = False

				UserAttribute.objects.filter(user_id=uid).update(silver=F('silver')+silver_loose_reward,xp=F('xp')+xp_loose_reward,energy=F('energy')-10,)
				UserActiveHero.objects.filter(user_hero_id=uid).update(hero_xp=F('hero_xp')+silver_loose_reward)

			# вернуть лист со статусом и наградами
				return fight_result_list

			elif user_stat_list['energy'] <10:
				fight_result_list['energy'] = False
				return fight_result_list


		else:
			return False

В этом куске кода в миксине, что выше при условии обновляются данные, возвращают лист с данными в контекст
elif user_power < enemy_power and user_stat_list['energy'] >=10:
				fight_result_list['energy'] = True
				fight_result_list['w_l'] = 'Поражение'
				fight_result_list['fight_color'] = '#CB4A3F'
				fight_result_list['xp'] = xp_loose_reward
				fight_result_list['silver'] = silver_loose_reward
				fight_result_list['drop_portal'] = False

				UserAttribute.objects.filter(user_id=uid).update(silver=F('silver')+silver_loose_reward,xp=F('xp')+xp_loose_reward,energy=F('energy')-10,)
				UserActiveHero.objects.filter(user_hero_id=uid).update(hero_xp=F('hero_xp')+silver_loose_reward)

			# вернуть лист со статусом и наградами
				return fight_result_list

Отображаемые данные, что обновляют эти строки не обновляются в контексте сразу, а только после очередного обновления страницы(в бд все обновляется сразу, а вот отображаемые данные в шаблоне- нет)
UserAttribute.objects.filter(user_id=uid).update(silver=F('silver')+silver_loose_reward,xp=F('xp')+xp_loose_reward,energy=F('energy')-10,)

UserActiveHero.objects.filter(user_hero_id=uid).update(hero_xp=F('hero_xp')+silver_loose_reward)

Нажал на кнопу - > вызвал вьюху "StartFight" - > передал данные в миксин, обработал -> вернул данные, но данные, что обновляется в других моделях отображаются только еще одного обновления, а не сразу.

Понимаю, что вопрос сформировал криво, но лучше не могу =)
  • Вопрос задан
  • 35 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
Используйте вместо QuerySet.update() изменение атрибутов объекта и MyModel().save() (если я не криво понял вопрос)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы