2014-10-28 75 views
0

嗨我保存時遇到重複對象的問題。 我該如何預防?避免Django def保存後複製

在此先感謝。

#models.py 
class Candidate(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    birth = models.CharField(max_length=50) 
    ... 

class Job(models.Model): 
    candidate = models.ManyToManyField('Candidate', through='CandidateToJob') 
    title = models.CharField(max_length=500) 
    ... 

class CandidateToJob(models.Model): 
    job = models.ForeignKey(Job, related_name='applied_to') 
    candidate = models.ForeignKey(Candidate, related_name='from_user') 
    STATUS_CHOICES = (
     ('1', 'Not approved'), 
     ('2', 'Approved'), 
     ('3', 'Hired') 
    ) 
    status = models.CharField(max_length=2, choices=STATUS_CHOICES) 

    class Meta: 
     unique_together = ("candidate", "job") 

下面是這個視圖

#views.py 
class JobDetails(generic.DetailView): 

model = Job 
template_name = 'companies/job-detail.html' 
form_class = ApplyForm 

def get_context_data(self, **kwargs): 
    context = super(JobDetails, self).get_context_data(**kwargs) 
    context['company_detail'] = Company.objects.all() 
    return context 

def post(self, request, *args, **kwargs): 
    form = self.form_class(request.POST) 
    messages.success(request, 'Sucesso!') 

    if form.is_valid(): 
     form.save(commit=False) 
     #create job 
     job = self.get_object(queryset=Job.objects.all()) 
     #create candidate 
     candidate = Candidate.objects.get(pk=request.user) 

     #assign to the through table 
     candidatetojob = CandidateToJob.objects.create(job=job, candidate=candidate) 

     candidatetojob.save() 

    return HttpResponseRedirect('/jobs/') 

而且形式

#forms.py 
class ApplyForm(ModelForm): 

class Meta: 
    model = CandidateToJob 
    exclude = ['candidate', 'job', 'status'] 

儘管unique_together,功能始終保存對象複製它們。

+0

爲什麼你使用DetailView而不是某種形式的視圖 - 例如UpdateView? – 2014-10-28 12:55:56

+0

嗨,丹尼爾。我正在使用它,因爲我想展示具體的工作和細節。你認爲使用updateview更適合這種情況嗎?我的意思是,即使我使用updateview,post方法不斷重複條目。 – 2014-10-28 14:54:40

回答

1

我明白了。這裏是我的代碼:

def post(self, request, *args, **kwargs): 
    form = self.form_class(request.POST) 

    #create job 
    job = self.get_object(queryset=Job.objects.all()) 

    #create candidate 
    candidate = Candidate.objects.get(pk=request.user) 

    #check if objects exists before save 
    if CandidateToJob.objects.filter(job = job, candidate = candidate).exists(): 

     messages.error(request, 'You have applied already for this position') 

     return HttpResponseRedirect(reverse('jobdetail', kwargs={'pk': job.pk})) 

    else: 

     if form.is_valid(): 
      form.save(commit=False) 

      #assign to the through table 
      candidatetojob = CandidateToJob.objects.create(job=job, candidate=candidate, status='0') 

      candidatetojob.save() 

      messages.success(request, 'Success! Good luck.') 

    return HttpResponseRedirect('/jobs/') 
+0

這不會從競賽狀態中拯救你。更好地用''atomic()''來包裝它 – doniyor 2014-12-26 11:11:41