Python 在django中定义一个用户和其他模型字段之间的关系

Python 在django中定义一个用户和其他模型字段之间的关系,python,django,Python,Django,我一直在做一个测试项目,一个用户可以有多个项目,这些项目可以有多个承包商。承包商必须首先注册自己,他们可以在不同的项目上工作。问题是,在定义一个用户并添加多个项目以及多个承包商后,如果我尝试通过注册另一个用户登录,那么第二个用户也会出现相同的项目,即使不创建任何新项目,如何将特定用户的数据与其他用户的数据分开 以下是我的模型: class UserProfile(models.Model): ## the client is the user user=models.OneToO

我一直在做一个测试项目,一个用户可以有多个项目,这些项目可以有多个承包商。承包商必须首先注册自己,他们可以在不同的项目上工作。问题是,在定义一个用户并添加多个项目以及多个承包商后,如果我尝试通过注册另一个用户登录,那么第二个用户也会出现相同的项目,即使不创建任何新项目,如何将特定用户的数据与其他用户的数据分开

以下是我的模型:

class UserProfile(models.Model):    ## the client is the user
     user=models.OneToOneField(User)
     def __unicode__(self):
        return self.user.username

class Contractor(models.Model):
   name=models.CharField(max_length=128)
   url=models.URLField()
   bill_rate=models.IntegerField(default=0)
   slug=models.SlugField(unique=True)

   def save(self, *args, **kwargs):
      self.slug=slugify(self.name)
      super(Contractor, self).save(*args, **kwargs)
   def __unicode__(self):
      return self.name

  class Project(models.Model):
    contractor=models.ManyToManyField(Contractor)
    client=models.OneToOneField(UserProfile, null=True)
    title=models.CharField(max_length=128)
    slug=models.SlugField(unique=True)
    contractor_hours=models.IntegerField(default=0)

    def save(self, *args, **kwargs):
       self.slug=slugify(self.title)
       super(Project, self).save(*args, **kwargs)

    def __unicode__(self):
       return self.title
以下是我注册新用户、承包商和仪表板视图的视图:

def user_login(request):
   context_dict={}
   if request.method=="POST":
      username=request.POST.get('username')
      password=request.POST.get('password')

      user=authenticate(username=username, password=password)

      if user:
        if user.is_active:
            login(request, user)
            return HttpResponseRedirect("/keeper/dashboard")
        else:
            return HttpResponse("Your account is disabled")
      else:
        print("Invalid login details: {0}, {1}".format(username, password))
        return HttpResponse("Invalid Login details supplied")
   else:
       return render(request, 'keeper/index.html', {})


 def addContractor(request):
     context_dict={}
     registered=False
     if request.method=="POST":
         contractor_form=ContractorForm(data=request.POST)

         if contractor_form.is_valid():
             contractor=contractor_form.save()
             registered=True
         else:
             print contractor_form.errors
     else:
         contractor_form=ContractorForm()

     return render(request, 'keeper/addContractor.html', {'contractor_form':contractor_form, 'registered':registered})

  def dashboard(request):
      context_dict={}
      project_list=Project.objects.filter(client__user=request.user).order_by('-title')
      contractor_list=Contractor.objects.order_by('-name')
      context_dict['Projects']=project_list
      context_dict['Contractors']=contractor_list
     return render(request, 'keeper/dashboard.html', context_dict)

   def addProject(request):
     context_dict={}

     if request.user.is_authenticated():
     current_user=request.user.username
     context_dict['user_name']=current_user
     #print current_user
     contractor_list=Contractor.objects.all()
     context_dict['contractor_list']=contractor_list

     if request.method=="POST":
        form=ProjectForm(request.POST)
        project_title=request.POST.get('title')
        contractor_value=request.POST.get('contractor_selected')
        contractor=Contractor.objects.get(name=contractor_value)
        #print project_title, contractor
        if form.is_valid():
            form.save(commit=True)
            get_recent_project=Project.objects.get(title=project_title)
            #print get_recent_project
            get_recent_project=Project.objects.get(title=project_title)
            ##print get_recent_project
            get_recent_project.client=current_user
            get_recent_project.save()
            get_recent_project.contractor.add(contractor)
            #print get_recent_project.contractor.all()
            #print get_clientOfProject
            return success(request)
           else:
            print form.errors
        else:
          form=ProjectForm()
          context_dict['form']=form
    else:
      print "none"
   return render(request, 'keeper/addProject.html', context_dict)

始终显示完整的项目列表,完全忽略承包商:

  project_list=Project.objects.order_by('-title')
尝试按当前登录用户拥有的项目筛选项目:

  project_list = Project.objects.filter(
      client__user=self.request.user
  ).order_by('-title')

请注意,您还始终向每个承包商展示的不仅仅是与项目相关的承包商。

嘿,我尝试使用您的解决方案,但它不起作用。因此,我找出了问题所在,并引导我找到了我的项目模型,在该模型中,我将UserProfile的客户端属性集用作foreignKey字段。我尝试将其更改为OneToOneField,但仍然不起作用。然后,我在“添加项目”视图中做了一些更改,并找到了将用户类实例传递到项目客户端字段所需的属性。因此,当我试图为当前客户获取项目列表时,我一个也没有得到。你能帮我吗?