如何在Django视图中实现用户与礼品的分配(含多礼品处理)?
Django视图实现礼品分配逻辑
需求说明
我有两张数据表:Users表和Gifts表,需要更新GiftAssignment表实现以下分配逻辑:
- 当用户数量与礼品数量相等时,每位用户分配一份礼品;
- 当两者数量不等时,多余的礼品分配给任意一位用户(即该用户将获得两份礼品)。
现有模型代码(models.py)
class GiftAssignment(models.Model): gift_id = models.IntegerField( default=0, blank=True, null=True ) gift_name = models.CharField( max_length=35, blank=True, null=True ) user_name = models.CharField( max_length=35, blank=True, null=True ) user_id = models.IntegerField( default=0, verbose_name="User ID", blank=True, null=True )
现有视图代码(views.py)
temp_arr = [] if remaining == 0: i = number #No. of gifts. z = number #No. of users. while z > 0: while i > 0: # this is to add users to DB obj = Gifts.objects.exclude(pk__in=temp_arr) for g in obj: g_pk = g.pk g_n = g.gift_name temp_arr.append(g_pk) GiftAssignment.objects.create( gift_id=g_pk, gift_name=g_n, ) i -= 1 z -= 1 elif remaining != 0: i = number z = number while z > 0: while i > 0: obj1 = Gifts.objects.exclude(pk__in=temp_arr) for g in obj1: # getting gifts are not in the array. g_pk = g.pk g_n = g.gift_name GateAssignment.objects.create( gift_id=g_pk1, gift_name=g_n1, # user_id=u_pk1, # user_name=u_n1, ) i -= 1 temp_arr.append(g_pk) z -= 1 # if there is a remaining. x = remaining # this to add the remaining d = GiftAssignment.objects.all() for pks in d: r_pk = pks.gift_id obj = Gifts.objects.exclude(pk__in=temp_arr) for g in obj: g_pk = g.pk g_n = g.gift_name for u_info in users: # users table. u_pk = u_info.user_id u_n = u_info.name while x > 0: GiftAssignment.objects.create( gift_id=g_pk1, gift_name=g_n1, user_id=u_pk1, user_name=u_n1, ) x -= 1 temp_arr.append(r_pk)
优化后的实现方案
现有代码存在逻辑混乱(变量名错误、循环嵌套不合理、未正确关联用户与礼品),以下是清晰的实现逻辑:
核心逻辑步骤
- 获取所有用户和礼品的数据集,计算两者数量;
- 优先给每个用户分配至少一份礼品;
- 若礼品数量多于用户数量,将多余礼品分配给任意用户(示例选第一个用户,也可随机选择);
- 可选:清空已有分配记录,保证每次分配是全新的结果。
完整视图代码
from django.shortcuts import render from .models import Users, Gifts, GiftAssignment import random def assign_gifts(request): # 获取所有用户和礼品数据 users = list(Users.objects.all()) gifts = list(Gifts.objects.all()) user_count = len(users) gift_count = len(gifts) # 清空已有分配记录(按需保留,若需保留历史记录则删除此行) GiftAssignment.objects.all().delete() # 处理空数据情况 if user_count == 0 or gift_count == 0: return render(request, 'result.html', {'message': '用户或礼品为空,无法分配'}) # 第一步:给每个用户分配一份礼品 for idx in range(min(user_count, gift_count)): user = users[idx] gift = gifts[idx] GiftAssignment.objects.create( gift_id=gift.pk, gift_name=gift.gift_name, user_id=user.pk, user_name=user.name ) # 第二步:处理多余礼品 extra_gifts = gifts[user_count:] if gift_count > user_count else [] if extra_gifts: # 随机选一个用户接收多余礼品,也可固定选第一个用户users[0] target_user = random.choice(users) for gift in extra_gifts: GiftAssignment.objects.create( gift_id=gift.pk, gift_name=gift.gift_name, user_id=target_user.pk, user_name=target_user.name ) return render(request, 'result.html', {'message': '礼品分配完成'})
补充说明
- 若你的
Users模型中用户名字段不是name,请替换为实际字段名; - 若不需要清空历史分配记录,删除
GiftAssignment.objects.all().delete()即可; - 多余礼品的接收用户可根据需求调整,示例中提供了固定选择和随机选择两种方式。
内容的提问来源于stack exchange,提问作者Khalid Seflan
相关产品推荐
相关产品推荐

