IntegrityError :(1062, "Duplicate for key 'user_id'")

442 Views Asked by At

I am trying to do some job portal kind of thing. I want to that one user can apply to different jobs but not the same one.Here when one user applied to one job he cant apply for another. That's the problem and by using my logic when i running the view i got

'integrityerror'

. Please help me. Thank You

model.py

class JobsApplied(models.Model):
    '''
        Events
    '''
    class Meta:
        '''
            Meta properties for this model
        '''
        app_label = 'admin'
        verbose_name_plural = 'JobsApplied'
    job = models.ForeignKey('Job', db_index=True,related_name='appliedjobs')
    user = models.OneToOneField(UserProfile)
    create_date = models.DateTimeField(auto_now_add=True)


    def __unicode__(self):
        '''
            Returns object display name
        '''
        return self.job

views.py

def job_applyview(request):
    job_id = request.POST.get('job_id')
    ## if admin have rights to apply the job please  remove "not request.user.is_staff"
    # job_id = 11
    if request.user and not request.user.is_staff:
        job = Job.objects.get(id=job_id)

        ### please enable below commands after verify
        user = UserProfile.objects.get(user__id=request.user.id)
        # applied_job = JobsApplied.objects.get(job=job, user=user)


        applied_job = JobsApplied.objects.create(job=job, user=user)
        applied_job.save(force_insert=True)

        message = "you have applied in as " + str(job.job_title)
        job_title = Job.objects.get(id=job_id).job_title
        industry_id = Job.objects.get(id=job_id)
        emp_name = IndustryProfile.objects.get(id=industry_id.industry_id).name
        email = IndustryProfile.objects.get(id=industry_id.industry_id).email
        b = StudentProfile.objects.get(user_profile=UserProfile.objects.get(user_id=request.user.id))
        name = b.name
        contact_num = b.mobile_phone
        location = b.address_line1
        if b.resume:
            resume = b.resume.url
        else:
            resume = ""
        body = '''Dear %s, \n The following candidate applied for the job that you have published in Nasscom Jobs Portal.
                       \n \n Job Title : %s \n name : %s \n Contact_No : %s \n Address : %s \n Resume : %s\n \n Thanks,\n  \n Job Portal                   Support Team''' % (
            emp_name, job_title, name, contact_num, location, resume)
        email = EmailMessage('Job Applied', body, to=[email])
        email.send()

        form = JobForm(instance=job)
        return render_to_response(
            'admin/job.html', {'form': form, 'message': message},
            context_instance=RequestContext(request),
        )
    else:
        return redirect('/admin/')
1

There are 1 best solutions below

0
Antwane On BEST ANSWER

You said:

one user can apply to different jobs

but you implemented as:

class JobsApplied(models.Model):
    # [...]
    user = models.OneToOneField(UserProfile)

OneToOne field is used when 2 objects are strongly linked together. Here, you say that any instance of JobApplied correspond to a unique user (which seems correct) but you also said any User is linked to 1 (and only 1) JobApplied instance. So in that form, a user cannot apply to 2 or more jobs.

What you want here is a 0..n relationship: you want a user apply to 0 or more Jobs. So you have to declare a ForeignKey in your UserProfile model.