You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

优化后的实现方案

现有代码存在逻辑混乱(变量名错误、循环嵌套不合理、未正确关联用户与礼品),以下是清晰的实现逻辑:

核心逻辑步骤

  1. 获取所有用户和礼品的数据集,计算两者数量;
  2. 优先给每个用户分配至少一份礼品;
  3. 若礼品数量多于用户数量,将多余礼品分配给任意用户(示例选第一个用户,也可随机选择);
  4. 可选:清空已有分配记录,保证每次分配是全新的结果。

完整视图代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:09:58