I guess it’s because both EXTRA_MODEL_FIELDS and strings referencing 
classes as ForeignKey positional argument rely on the class_prepared 
signal. But with it being only sent once, the ForeignKey doesn't have any 
chance to catch the signal in time.

For every other use case other than a self-referencing ForeignKey, either 
the model being referenced has been created when the extra ForeignKey is 
added and it can be resolved as a class right away, or the ForeignKey will 
be able to resolve the class as soon as it send the class_prepared signal.
In the case of a self-referencing extra ForeignKey, the ForeignKey is added 
after the class_prepared signal has been fired but can't resolve the string 
into a class yet because the model has not finished initializing. So the 
ForeignKey connect to the class_prepared signal and wait for the class that 
just fired it to fire it "again". In vain.

One solution could be to re-raise the class_prepared signal after extra 
fields had been added to a model. To do so, you could change the 
add_extra_model_fields function in mezzanine/boot/__init__.py to:
def add_extra_model_fields(sender, **kwargs):
    """
    Injects custom fields onto the given sender model as defined
    by the ``EXTRA_MODEL_FIELDS`` setting.
    """
    model_path = "%s.%s" % (sender.__module__, sender.__name__)
    extra_fields = fields.get(model_path, {})
    if (extra_fields):
        for field_name, field in extra_fields.items():
            field.contribute_to_class(sender, field_name)
        del fields[model_path]
        # re-send the class_prepared signal so self-referencing ForeignKey 
can catch up
        class_prepared.send(sender=sender)


Le vendredi 20 février 2015 17:44:37 UTC+1, Kacper Kołodziej a écrit :
>
> Hi! I'm trying to create multi-level categories structure. I have added 
> ForeignKey to 'self' to BlogCategory. I've tried to do it in some different 
> ways: http://pastebin.com/77ex9ehe but none of them works. I always 
> receive error on syncdb:
>
> CommandError: One or more models did not validate:
>> blog.blogcategory: 'parent_category' has a relation with model self, 
>> which has either not been installed or is abstract.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Mezzanine Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to