Welcome | Get started | Dive | Contribute | Topics | Reference | Changes | More
Django 1.7 complains about clashing fields¶
This document describes the main issue in #38 (Make Lino run with Django 1.8).
>>> from lino import startup
>>> startup('lino_book.projects.min9.settings')
>>> from lino.api.doctest import *
How to reproduce it:
Get the latest development version of Lino (see Install your Lino developer environment).
In your copy of file https://gitlab.com/lino-framework/lino/blob/master/lino/setup_info.py, change install_requires=[‘django<1.7’… to install_requires=[‘django’….
In the top-level directory of your Lino repository, run
$ inv prep test
It fails already during initdb, more precisely the prep of
lino_book.projects.min2
. So you can avoid running the whole test
suite by doing e.g.:
$ go lino
$ cd lino_book.projects/min2
$ ./initdb_tmp
The problem there is that Django 1.7+ complains about clashing fields:
contacts.Person.FOO: (models.E006) The field 'FOO' clashes with the field 'addr1' from model 'contacts.partner'.
These are the fields defined in the AddressLocation
mixin, inherited by
the abstract Partner
and Person
models of
lino_xl.lib.contacts
, which are then themselves inherited by
Partner
and Person
in lino_book.projects.min2.modlib.contacts
.
The following diagram shows the structure for Person (for Company it is analog):
It might be useful to understand
lino_book.projects.diamond
,
lino_book.projects2.diamond
,
and the code of lino.core.inject
before working on this problem.
The problem might be related to the fact that AFTER17 the name field occurs twice in the list of fields:
>>> Person = rt.models.contacts.Person
>>> from lino import AFTER17
>>> from lino.core.fields import VirtualField
>>> [f.name for f in Person._meta._get_fields(reverse=False)
... if not isinstance(f, VirtualField)]
['id', 'email', 'language', 'url', 'phone', 'gsm', 'fax', 'modified', 'created', 'country', 'city', 'zip_code', 'region', 'addr1', 'street_prefix', 'street', 'street_no', 'street_box', 'addr2', 'vat_regime', 'vat_id', 'prefix', 'name', 'remarks', 'payment_term', 'purchase_account', 'partner_ptr', 'title', 'first_name', 'middle_name', 'last_name', 'gender', 'birth_date']
See the _get_fields()
method of
django.db.models.options.Options
(in Django 1.7+).
When trying to test this document AFTER17, we even get a traceback at the first line:
from lino.api.doctest import *
Exception raised:
Traceback (most recent call last):
...
File "django/apps/registry.py", line 131, in check_models_ready
raise AppRegistryNotReady("Models aren't loaded yet.")
AppRegistryNotReady: Models aren't loaded yet.