繁体   English   中英

没有而不是空的 Object 实例?

[英]None instead of empty Object instance?

我正在尝试使用 Python Django 创建 Secret Santa web 站点。 我遇到的问题是当有奇数的参与者时。 我正在使用 Django 的内置用户 model 并将其实例配对为游戏的匹配项。 如果是单数,将有一个不匹配的参与者。 有没有办法在不引发ValueError的空实例的情况下存储None?

这是我的代码:

模型.py

class Participants (models.Model):
    giver = models.OneToOneField(User, on_delete=models.CASCADE, null = True, blank = True, related_name = "giver")
    receiver = models.OneToOneField(User, on_delete=models.CASCADE, null = True, blank = True, related_name = "receiver")

    def __str__(self):
        return self.receiver.username

视图.py

def matchPairs(request):
    participants = User.objects.all().exclude(is_superuser=True)
    participants_names = [p.id for p in participants]
    i = 0
    Givers = []
    Receivers = []
    if request.method == "POST":
        [givers, receivers] = pairs_generator.generate_match(participants_names)
        while i < len(receivers):
            if givers[i] == None:
                Givers.append(None) 
            else:
                Givers.append(User.objects.filter(pk = givers[i]))
            Receivers.append(User.objects.filter(pk = receivers[i]))
            
            Participants.objects.create(giver = Givers[i], receiver = Receivers[i])
            messages.success(request, "Matching successful! Here's the list.")
            return redirect('participants')
    else:
        messages.error(request, "Woops. Something went wrong. Please try again.")
        return redirect('participants')

生成匹配.py

def generate_match(participants_names):
    givers = []
    receivers = []
    flag = None
    random.shuffle(participants_names)
    i = 0
    while i < len(participants_names):
      if (is_even(participants_names)):
          print(f'{participants_names[i]} exchanges gifts with {participants_names[i + 1]}. ')
          givers.append(participants_names[i])
          receivers.append(participants_names[i+1])
          i += 2 
      else:
          print(f'{participants_names[i]} has no one to buy a gift to this year. :(')
          givers.append(flag)
          receivers.append(participants_names[i])
          participants_names.pop(i)
    return givers, receivers

任何帮助或建议都会有所帮助。

编辑这是错误回溯:

Traceback (most recent call last):
  File "/Users/fatimavelic/Documents/Doing/projects/penv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/fatimavelic/Documents/Doing/projects/penv/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/fatimavelic/Documents/Doing/projects/penv/santa/secretsanta/views.py", line 44, in matchPairs
    Participants.objects.create(giver = Givers[i], receiver = Receivers[i])
  File "/Users/fatimavelic/Documents/Doing/projects/penv/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/fatimavelic/Documents/Doing/projects/penv/lib/python3.9/site-packages/django/db/models/query.py", line 455, in create
    obj = self.model(**kwargs)
  File "/Users/fatimavelic/Documents/Doing/projects/penv/lib/python3.9/site-packages/django/db/models/base.py", line 489, in __init__
    _setattr(self, field.name, rel_obj)
  File "/Users/fatimavelic/Documents/Doing/projects/penv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 310, in __set__
    super().__set__(instance, value)
  File "/Users/fatimavelic/Documents/Doing/projects/penv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 215, in __set__
    raise ValueError(

Exception Type: ValueError at /secretsanta/match-pairs/
Exception Value: Cannot assign "<QuerySet [<User: Daisy>]>": "Participants.receiver" must be a "User" instance.

Queryset.filter返回一个新的 Queryset 对象。 您想改用Queryset.get(pk=...)Queryset.filter(...).first()您还可以完全避免额外的数据库调用,例如通过按主键索引所有用户: id_to_user = {_.pk: _ for _ in participants}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM