2014-06-23 44 views
0

我有很多問題,我敢肯定很容易,但不適合我。在模型對象中搜索值,如果存在的話

我有2種型號:

  1. VipPassesModel
  2. ProfileModel

然後我這個觀點,至極的目的是執行以下任務(順序):

  1. 搜索「VIP代碼」是否存在於「VipPassesModel」中
  2. 如果存在「VIP代碼」,請檢查是否與某個用戶(配置文件模型 - 外鍵)匹配
  3. 如果沒有用戶與該VIP代碼簽名,則將當前用戶登錄(Id - 外鍵)保存在該VIP中代碼(這會讓這個VIP代碼不再可用)

我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

你的觀點應該是:

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,因爲列表是空的,如果有一個模型與達代碼,它返回像[VipPassesModel]的對象,以便訪問到它,你需要做的VipPassesModel.objects.filter(code = vipcode)[0]

拉documentación去Django的公報自我埃斯特TIPO德querys ESTA bastante邊,TE recomiendo闕樂eches聯合國ojo a Django Queries

-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個請求不衝突。第二次請求可以覆蓋第一次請求的分配。

+0

'如果沒有對象.filter'沒有失敗,就沒有必要使用'嘗試except' – AlvaroAV

+0

@Liarez,你有沒有注意到'[ 0]'來獲取對象? – Rohan

+0

不,我現在明白你爲什麼使用try除了。無論如何,你可以做'如果VipPassesModel.objects。過濾器(代碼= vipcode,user_asigned = NULL):'如果它是真的,將有一個肯定的對象 – AlvaroAV

0

非常感謝你!......你是最棒的......我需要更多像你這樣的朋友。

這是最後查看代碼:

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.id 

     if VipPassesModel.objects.filter(code = vipcode): 
      vipObject = VipPassesModel.objects.filter(code = vipcode)[0] # Get the object 
      if not vipObject.user_asigned: #If object doesn't have user 
       vipObject.user_asigned = ProfileModel.objects.get(pk = user_to_asign) # Assign actual user 
       vipObject.save() # Save object 
       # VIP Code encontrado y User Asignado. 
      else: 
       # VIP Code encontrado pero ya tiene un User Asignado. 
     else: 
      #VIP Code no encontrado o ya tiene un User Asignado 
else: 
    form = VipPassesForm() 

return render(request,'vipcode.html',{'form':form},context_instance=RequestContext(request))