我遇到很多问题,我确信这很容易,但不适合我。
我有2个型号:
然后我就是这个观点,目的是执行以下任务(按此顺序):
我的VipPassesModel:
class VipPassesModel(models.Model):
"""
VIP Passes Code Model.
"""
code = models.CharField(max_length = 15)
is_used = models.BooleanField(default=False)
user_asigned = models.ForeignKey(ProfileModel, related_name='profile_name', verbose_name="User Full Name", blank=True, null=True,)
我的View.py
def vipcodevalidation(request):
"""
Funcion que recibe el CODE VIP y si es valido, lo asigna al usuario actual
"""
if request.method == 'POST':
form = VipPassesForm(data=request.POST)
if form.is_valid():
vipcode = form.cleaned_data['code']
user_to_asign = request.user
if VipPassesModel.objects.filter(code = vipcode).exists():
# Tomar el objeto y grabarle en "user_asigned" el id del usuario de django logueado actualmente (user_to_asign)
else:
#nada que hacer aqui
else:
form = VipPassesForm()
return render(request,'vipcode.html',{'form':form},context_instance=RequestContext(request))
我会帮助你们提供任何帮助。为了清楚起见,我没有收到错误消息,只是我不知道如何解决这个问题。
答案 0 :(得分:0)
您的观点应该是:
if VipPassesModel.objects.filter(code = vipcode): #If there is object with that code
vipObject = VipPassesModel.objects.filter(code = vipcode)[0] # Get the object
if not vipObject.user_assigned: #If object doesn't have user
vipObject.user_assigned = request.user.id # Assign actual user
vipObject.save() # Save object
else:
#nada que hacer aqui
如果没有对象,当你if VipPassesModel.objects.filter(code = vipcode):
时,你会得到[]
(空列表),所以如果你if []
它会返回false,因为列表是空的,如果有的话是一个带有tat代码的模型,它返回像[VipPassesModel]
这样的对象,所以要访问它,你需要做VipPassesModel.objects.filter(code = vipcode)[0]
(ladocumentacióndeDjango oficial sobre este tipo dequerysestábastantebien,te recomiendo que le eches un ojo a Django Queries )
答案 1 :(得分:-1)
简单地说,这就是你可以做的事情
try:
vipobj = VipPassesModel.objects.filter(code = vipcode, user_asigned = NULL)[0]
except IndexError:
#no vip code free to assign bail out
vipobj.user_assigned = user_to_asign
vipobj.save()
在实际生产级别代码中,您应该在事务解决方案中进行这些操作,来自不同用户的2个请求不会发生冲突。第二个请求可能会覆盖第一个请求的分配。