Alex P
Alex P

Reputation: 124

Django models.ForeignKey issue with model with custom foreign key

I use Django 1.11, Python 3.6 and PostgreSQL 9.6.
I define two models as described in the documentation.

class CircDetect(models.Model):
    oid = models.AutoField(primary_key=True)
    ...

    class Meta:
        db_table = 'circdetect'


class PatientMed(models.Model):
    ...
    circdetect = models.ForeignKey(CircDetect, on_delete=models.CASCADE, to_field='oid')
    ...

But when I try to get an access to the list of PatientMed objects on the admin site I get an exception:

ProgrammingError at /canreg/editor/patientmed/
column patient_med.circdetect_id does not exist
LINE 1: ... "patient_info"."id") INNER JOIN "circdetect" ON ("patient_m...
HINT: Perhaps you meant to reference the column "patient_med.circdetect".

It looks like Django tries to get id filed of circdetect, which is actually has name oid.

What can I do to fix this issue?

EDITED on 21 jul

As Ahmad took note below, I have an another model, that I didn't mention. I'm not sure it affects on the error in this case but this is that model:

class PatientInfo(models.Model):
    ...
    class Meta:
        db_table = 'patient_info'

And PatientMed is connected with PatientInfo this way:

class PatientMed(models.Model):
    info = models.OneToOneField(PatientInfo, on_delete=models.CASCADE, primary_key=True)
    ...

But it works without any problems.

I should say, that circdetect is a legacy table, that I already had in my database when I started work.

EDITED

I use this code to show PatientMed objects in the admin site:

class PatientMedAdmin(admin.ModelAdmin):
    list_display = (
        'info',
        ...
        'circdetect',
        ...
    )
    list_per_page = 25

admin.site.register(models.PatientMed, PatientMedAdmin)

EDITED

As Alasdair ask below I put here full models. There is no secret in them, but they are big

class CircDetect(models.Model):
    oid = models.AutoField(primary_key=True)
    code = models.SmallIntegerField(blank=True, null=True)
    txt = models.CharField(max_length=50, blank=True, null=True)

    class Meta:
        db_table = 'circdetect'
        ordering = ['code']


class PatientInfo(models.Model):
    objects = models.Manager()

    first_name = models.CharField(max_length=50, blank=True, null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    patronymic = models.CharField(max_length=50, blank=True, null=True)
    birth_date = models.DateField(blank=True, null=True)
    zip_code = models.CharField(max_length=6, blank=True, null=True)
    address = models.TextField(blank=True, null=True)
    home_phone = models.CharField(max_length=11, blank=True, null=True)
    cell_phone = models.CharField(max_length=11, blank=True, null=True)
    e_mail = models.EmailField(null=True)

    def __str__(self):
        return u'%s %s %s %s' % (to_str(self.last_name), to_str(self.first_name),
                                 to_str(self.patronymic), to_str(self.birth_date))

    class Meta:
        db_table = 'patient_info'


class PatientMed(models.Model):
    objects = models.Manager()

    info = models.OneToOneField(PatientInfo, on_delete=models.CASCADE, primary_key=True)

    center = models.SmallIntegerField(blank=True, null=True)
    sex = models.SmallIntegerField(blank=True, null=True)
    fddate = models.DateField(blank=True, null=True)
    tsdate = models.DateField(blank=True, null=True)
    tdate = models.DateField(blank=True, null=True)
    edate = models.DateField(blank=True, null=True)
    otcode = models.SmallIntegerField(blank=True)
    ddate = models.DateField(blank=True, null=True)
    death_icd = models.CharField(max_length=7, blank=True, null=True)
    ecode = models.SmallIntegerField(blank=True, null=True)
    esource = models.SmallIntegerField(blank=True, null=True)
    dcause = models.SmallIntegerField(blank=True, null=True)
    dsource = models.SmallIntegerField(blank=True, null=True)
    numtumor = models.SmallIntegerField(blank=True, null=True)
    iccc = models.CharField(max_length=3, blank=True, null=True)
    icd_10 = models.CharField(max_length=7, blank=True, null=True)
    icd_o = models.CharField(max_length=5, blank=True, null=True)
    fds = models.TextField(blank=True, null=True)
    circdetect = models.ForeignKey(to=CircDetect, on_delete=models.CASCADE, to_field='oid')
    hyst = models.CharField(max_length=5, blank=True, null=True)
    cyto = models.CharField(max_length=5, blank=True, null=True)
    exp_oper = models.CharField(max_length=5, blank=True, null=True)
    immun = models.CharField(max_length=5, blank=True, null=True)
    cytogen = models.CharField(max_length=5, blank=True, null=True)
    lab_instr = models.CharField(max_length=5, blank=True, null=True)
    incentr = models.CharField(max_length=5, blank=True, null=True)
    lasttest = models.DateField(blank=True, null=True)
    lastsource = models.SmallIntegerField(blank=True, null=True)
    lfudate = models.DateField(blank=True, null=True)
    lfucode = models.SmallIntegerField(blank=True, null=True)
    otregion = models.CharField(max_length=5, blank=True, null=True)
    date_actend = models.DateField(blank=True, null=True)
    concord = models.SmallIntegerField(blank=True, null=True)
    protocol = models.CharField(max_length=10, blank=True, null=True)
    autopsie = models.CharField(max_length=5, blank=True, null=True)
    tabort = models.SmallIntegerField(blank=True, null=True)
    stage = models.SmallIntegerField(blank=True, null=True)
    stage_sym = models.CharField(max_length=4, blank=True, null=True)
    chirurg = models.CharField(max_length=5, blank=True, null=True)
    radiolog = models.CharField(max_length=5, blank=True, null=True)
    chimio = models.CharField(max_length=5, blank=True, null=True)
    rdate = models.DateField(blank=True, null=True)
    rem = models.TextField(blank=True, null=True)
    t_tnm = models.SmallIntegerField(blank=True, null=True)
    n_tnm = models.SmallIntegerField(blank=True, null=True)
    m_tnm = models.SmallIntegerField(blank=True, null=True)
    g_tnm = models.SmallIntegerField(blank=True, null=True)
    encr_bas = models.SmallIntegerField(blank=True, null=True)
    ct_tnm = models.SmallIntegerField(blank=True, null=True)
    cn_tnm = models.SmallIntegerField(blank=True, null=True)
    cm_tnm = models.SmallIntegerField(blank=True, null=True)
    land = models.IntegerField(blank=True, null=True)
    lum = models.CharField(max_length=5, blank=True, null=True)
    oss = models.CharField(max_length=5, blank=True, null=True)
    hepar = models.CharField(max_length=5, blank=True, null=True)
    lung = models.CharField(max_length=5, blank=True, null=True)
    brain = models.CharField(max_length=5, blank=True, null=True)
    skin = models.CharField(max_length=5, blank=True, null=True)
    nephro = models.CharField(max_length=5, blank=True, null=True)
    herm = models.CharField(max_length=5, blank=True, null=True)
    periton = models.CharField(max_length=5, blank=True, null=True)
    kmark = models.CharField(max_length=5, blank=True, null=True)
    unknown = models.CharField(max_length=5, blank=True, null=True)
    other = models.CharField(max_length=5, blank=True, null=True)
    acc = models.IntegerField()

    class Meta:
        db_table = 'patient_med'

Upvotes: 1

Views: 1276

Answers (3)

Alex P
Alex P

Reputation: 124

I'm not sure what was the cause of the problem. I solved it by dropping my database and recreating it and my entities.
Thank you everyone.

Upvotes: 0

Happy Ahmad
Happy Ahmad

Reputation: 1087

You haven't written the instruction that makes the error. But it seems that you have another table named PatientInfo that the error is related to.

Upvotes: 0

Alasdair
Alasdair

Reputation: 308909

It sounds like you have to specify db_column, to let Django know the name of the column in the PatientMed column.

class PatientMed(models.Model):
    circdetect = models.ForeignKey(CircDetect, on_delete=models.CASCADE, db_column='circdetect', to_field='oid')

Upvotes: 2

Related Questions