#26163: Wrong related fields in ._meta.get_fields with multiple database on foreignkey -------------------------------------+------------------------------------- Reporter: aRkadeFR | Owner: nobody Type: Bug | Status: new Component: Database layer | Version: 1.9 (models, ORM) | Keywords: models, meta, Severity: Normal | get_fields, fields, router, | multiple, databases Triage Stage: Unreviewed | Has patch: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- Hello,
I tried to find a similar ticket and didn't find it. I setup a simple use case to show the error. 2 applications: appa and appb. You override (by inheritance) django.contrib.auth.models.Group in <appa>, you have a model ModelB in <appb> that has a foreign key to Group of django.contrib.auth. You setup a DatabaseRouter to route every <appa> model to the 'default' database, and all <appb> model to the 'other' database. If you ._meta.get_fields() on GroupA, you see the foreign key of the ModelB which is related to django.contrib.auth in the other database. The related field shouldn't be visible from the get_fields() on GroupA. I got this error from debugging a "missing attribute" while Django was emulating the DELETE ON_CASCADE in python and following the wrong parent model to get then the related_fields. Thanks for all the information and keep up the good work :) {{{ # settings DATABASE_ROUTERS = ['projecta.router.CustomRouter'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'HOST': 'localhost', 'PORT': '5432', 'NAME': 'default', 'USER': 'postgres_user', 'PASSWORD': 'pouetpouet', }, 'other': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'HOST': 'localhost', 'PORT': '5432', 'NAME': 'other', 'USER': 'postgres_user', 'PASSWORD': 'pouetpouet', } } # projecta/router.py class CustomRouter(object): """ CustomRouter """ def db_for_read(self, model, **hints): if model._meta.app_label == 'appb': return 'other' if model._meta.app_label == 'auth': return 'other' return None def db_for_write(self, model, **hints): if model._meta.app_label == 'appb': return 'other' if model._meta.app_label == 'auth': return 'other' return None def allow_relation(self, obj1, obj2, **hints): if obj1._meta.app_label == 'auth' or \ obj2._meta.app_label == 'auth': return True return None def allow_migrate(self, db, app_label, model=None, **hints): """ auth need to go to the other database (for projectb) """ if app_label == 'appa': return db == 'default' if app_label == 'appb': return db == 'other' return None # appa/models.py from django.contrib.auth.models import Group from django.db import models class GroupA(Group): extra_field = models.IntegerField() # appb/models.py from django.contrib.auth.models import Group class ModelB(models.Model): group = models.ForeignKey(Group, null=False) # ipython In [3]: GroupA._meta.get_fields() Out[3]: (<ManyToManyRel: auth.user>, <ManyToOneRel: projectb.modelb>, <...> }}} -- Ticket URL: <https://code.djangoproject.com/ticket/26163> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/051.d6bfa1f84249644fef7e82235e1188b0%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.