在模型对象中搜索值,如果存在

时间:2014-06-23 05:09:53

标签: python django

我遇到很多问题,我确信这很容易,但不适合我。

我有2个型号:

  1. VipPassesModel
  2. ProfileModel
  3. 然后我就是这个观点,目的是执行以下任务(按此顺序):

    1. 搜索" VIP代码"存在于" VipPassesModel"
    2. 如果" VIP代码"存在检查是否作为某个用户(配置文件模型 - 外键)分配给它
    3. 如果没有用户签署该VIP代码,则保存该VIP代码中的当前用户登录(Id - 外键)(这将使此Vip代码不再可用)
    4. 我的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))
      

      我会帮助你们提供任何帮助。为了清楚起见,我没有收到错误消息,只是我不知道如何解决这个问题。

2 个答案:

答案 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个请求不会发生冲突。第二个请求可能会覆盖第一个请求的分配。