Opened 10 years ago

Closed 10 years ago

Last modified 9 years ago

#521 closed enhancement (fixed)

Multilevel foreign key ordering causes error in Admin changeview

Reported by: andreas Owned by: adrian
Component: Metasystem Version:
Severity: blocker Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

Description

Ordering by a foreign key of a model which is itself ordered by another foreign key causes a "column does not exist"-error in Admin changeview.

Code:

class ParentClass(meta.Model):
    somevar        = meta.CharField(maxlength=100)
    def __repr__(self):
        return self.somevar
    class META:
        admin      = meta.Admin(list_display = ('somevar'))
        ordering   = ['somevar']
 
class FirstChild(meta.Model):
    theparent      = meta.ForeignKey(ParentClass)
    myvar          = meta.CharField(maxlength=100)
    def __repr__(self):
        return self.myvar
    class META:
        admin = meta.Admin(list_display = ('myvar', 'theparent'))
        ordering = ['theparent']

class ChildsChild(meta.Model):
    firstchild     = meta.ForeignKey(FirstChild)
    myownvar       = meta.CharField(maxlength=100)
    def __repr__(self):
        return self.myownvar
    class META:
        admin = meta.Admin(list_display = ('myownvar', 'firstchild'))
        ordering   = ['firstchild']

Error when viewing Admin changeview of ChildsChild:

There's been an error:

Traceback (most recent call last):

  File "C:\Programme\Python24\lib\site-packages\django\core\handlers\base.py", line 64, in get_response
    response = callback(request, **param_dict)

  File "C:\Programme\Python24\lib\site-packages\django\views\admin\main.py", line 183, in change_list
    result_list = lookup_mod.get_list(**lookup_params)

  File "C:\Programme\Python24\lib\site-packages\django\utils\functional.py", line 3, in _curried
    return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items()))

  File "C:\Programme\Python24\lib\site-packages\django\core\meta\__init__.py", line 1123, in function_get_list
    return list(function_get_iterator(opts, klass, **kwargs))

  File "C:\Programme\Python24\lib\site-packages\django\core\meta\__init__.py", line 1106, in function_get_iterator
    cursor.execute("SELECT " + (kwargs.get('distinct') and "DISTINCT " or "") + ",".join(select) + sql, params)

  File "C:\Programme\Python24\lib\site-packages\django\core\db\base.py", line 10, in execute
    result = self.cursor.execute(sql, params)

ProgrammingError: ERROR:  column myproject_firstchilds.theparent does not exist

Change History (6)

comment:1 Changed 10 years ago by jd@…

  • Severity changed from normal to blocker

I believe I have ran into a problem relating to this as well. The below is a lot of information but
I hope it helps resolve the issue. I assigned this as a blocker as it essentially makes my app unusable
if it is indeed a bug. Take the following two models:

class Company(meta.Model):
   name = meta.CharField(maxlength=150, help_text='The company name')
   type = meta.ForeignKey(CompanyType, core='true', verbose_name='type', help_text='Vendor/Lead')
   status = meta.ForeignKey(CompanyStatu, help_text='Inactive/Active', verbose_name='status')
   def __repre__(selef):
      return self.name
   class META:
      db_table = 'company'
      admin = meta.Admin(
         list_display = ('name','type','status'),)

And:

class Address(meta.Model):
   company_id = meta.ForeignKey(Company, core='true', edit_inline=meta.STACKED, num_in_admin=1, help_text='This column does exist!',related_name='id',db_column='company_id')
   address_type = meta.ForeignKey(AddressType, core='true', help_text='This is the type of address')
   address1 = meta.CharField(maxlength=150)
   address2 = meta.CharField(maxlength=150)
   address3 = meta.CharField(maxlength=150)
   city = meta.ForeignKey(City)  
   state_province = meta.ForeignKey(StateProvince)
   country = meta.ForeignKey(Country)
   mail_code = meta.ForeignKey(MailCode)
   class META:
      db_table = 'addresses'
      admin = meta.Admin(
         list_display = ('id','address_type','address1','city'),
      )

When trying to add a new address I receive the following:

here's been an error:

Traceback (most recent call last):

  File "/usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/core/handlers/base.py", line 71, in get_response
    response = callback(request, **param_dict)

  File "/usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/contrib/admin/views/decorators.py", line 49, in _checklogin
    return view_func(request, *args, **kwargs)

  File "/usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/contrib/admin/views/main.py", line 814, in add_stage
    elif not f.blank and ((isinstance(f.rel, meta.ManyToOne) and not f.rel.raw_id_admin) or f.choices) and len(manipulator[f.name].choices) == 2:

  File "/usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/core/formfields.py", line 26, in __getitem__
    raise KeyError, "Field %s not found" % field_name

KeyError: 'Field company_id not found'

However as you can see from the below the SQL schema (PostgreSQL) contains the required information:

Table company:

CREATE TABLE company (
    id serial NOT NULL,
    name character varying(150) NOT NULL,
    type_id integer NOT NULL,
    status_id integer NOT NULL
);

Table addresses:

CREATE TABLE addresses (
    id serial NOT NULL,
    company_id integer NOT NULL,
    address_type_id integer NOT NULL,
    address1 character varying(150) NOT NULL,
    address2 character varying(150) NOT NULL,
    address3 character varying(150) DEFAULT ''::character varying NOT NULL,
    city_id integer NOT NULL,
    state_province_id integer NOT NULL,
    country_id integer NOT NULL,
    mail_code_id integer NOT NULL
);


ALTER TABLE public.addresses OWNER TO postgres;

--
-- Name: addresses_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace:
--

ALTER TABLE ONLY addresses
    ADD CONSTRAINT addresses_pkey PRIMARY KEY (id);


ALTER INDEX public.addresses_pkey OWNER TO postgres;

--
-- Name: addresses_address_type_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY addresses
    ADD CONSTRAINT addresses_address_type_id_fkey FOREIGN KEY (address_type_id) REFERENCES address_type(id);


--
-- Name: addresses_city_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY addresses
    ADD CONSTRAINT addresses_city_id_fkey FOREIGN KEY (city_id) REFERENCES cities(id);


--
-- Name: addresses_company_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY addresses
    ADD CONSTRAINT addresses_company_id_fkey FOREIGN KEY (company_id) REFERENCES company(id);


--
-- Name: addresses_country_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY addresses
    ADD CONSTRAINT addresses_country_id_fkey FOREIGN KEY (country_id) REFERENCES countries(id);


--
-- Name: addresses_mail_code_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY addresses
    ADD CONSTRAINT addresses_mail_code_id_fkey FOREIGN KEY (mail_code_id) REFERENCES mailcodes(id);


--
-- Name: addresses_state_province_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY addresses
    ADD CONSTRAINT addresses_state_province_id_fkey FOREIGN KEY (state_province_id) REFERENCES state_province(id);



comment:2 Changed 10 years ago by oz.robharvey@…

  • Severity changed from blocker to normal

Hi JD,
Don't know if you are still working on this but the problem is you tried to use a foreign key with "_id" at the end of the field name. Django will try to append that string and apparently misinterpreted.
If you said:

class Address(meta.Model):
    company = ForeignKey(....)

you should have no problems.

BTW, when you do this, refer to the object that you want to look up by the method instead of the field name. i.e. if you wanted to add a repr() to your Address class, try this:

    def __repr__(self):
        return self.get_company().__repr__() + address1

I'm going to mark this back to normal because it appears not to block if you do things that way. But I don't know if the ordering is working right or not, so I can close.

comment:3 Changed 10 years ago by asmodai@…

  • milestone changed from Version 0.91 to Version 0.92

0.91 was released, this should move to 0.92 then.

comment:4 Changed 10 years ago by jd@…

I specific problem seems to be fixed in a later update. I am unsure of what actually fixed it though. It does not appear they were the same problem.

comment:5 Changed 10 years ago by adrian

  • Resolution set to fixed
  • Status changed from new to closed

If it's fixed, I'll mark as closed.

comment:6 Changed 9 years ago by adrian

  • milestone Version 0.92 deleted

Milestone Version 0.92 deleted

Note: See TracTickets for help on using tickets.
Back to Top