[英]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.