Hello,

My problem is very rare so I'll try ad add as much useful detail as 
possible.

I am using python 3.5 and 3.6, Django 1.11.4 

I am creating complex security related application and need to generate 
additional models based on other applications' models. In general, 
everything works fine, models are created, migrated without a problem. But 
there is single problem I totally failed to solve.

Let's say there is preexisting model Alpha of some other application and I 
dynamically create model Beta which references Alpha with ForeignKey. The 
problem is that Beta does not get reverse relation, so I can query for 
beta.alpha, but not for alpha.betas. I receive 
"django.core.exceptions.FieldError: Cannot resolve keyword 'betas' into 
field. Choices are: x, y, z"

Here is my code























*    def _create_dynamic_model(self, model_label, fields, attributes=None, 
options=None):        from django.db import models        class 
Meta:            pass        setattr(Meta, 'app_label', '_talos')        if 
options is not None:            for key, value in 
options.items():                setattr(Meta, key, value)        attrs = 
{'__module__': '_talos', '_talos_dynamic': True, 'Meta': Meta}        if 
attributes:            attrs.update(attributes)        if 
fields:            attrs.update(fields)        model = type(model_label, 
(models.Model,), attrs)        return model*

I call it like this (where self.model is referenced model class)

    def _create_object_permission_model(self):
        from django.db import models

        return self._create_dynamic_model(
            'o_{0}_{1}'.format(self.model._meta.app_config.label, 
self.model.__name__),
            fields={
                'role': models.ForeignKey(
                    'talos.Role',
                    related_name='+',
                    on_delete=models.CASCADE),
                'permission': models.ForeignKey(
                    'talos.ObjectPermission',
                    related_name='+',
                    on_delete=models.CASCADE),
                'target': models.ForeignKey(
                    self.model,
                    related_name='talos_permissions', # self.model does not 
receive reverse relation!
                    on_delete=models.CASCADE)
            },
            options={
                'unique_together': [('role', 'permission', 'target')],
                'index_together': [
                    ('target', 'permission', 'role'),
                    ('target', 'role', 'permission'),
                    ('role', 'target', 'permission')]
            })


I tried calling contribute_to_class and contribute_to_related_class methods 
manually, tried to call this code at different moments (My application 
ready method, class_prepared signal handler), with absolutely no luck.

I tried to read Django sources, and got that contribute_to_related_class is 
called from contribute_to_class with delay, but it did not help me realize 
what exactly I am doing wrong.

I am trying to use reverse relation from custom view and admin, so 
everything should be pretty much initialized already.

Roman

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/762bd583-1daa-4229-8355-21c9fc821986%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to