Десериализация модели с несколькими родительскими моделями приводит к ошибке «... объект не имеет атрибута ...» - PullRequest
0 голосов
/ 15 марта 2020

Прежде всего извините за длинный пост. Я просто пытаюсь по-настоящему разобрать проблему.

Я использую пакеты django-moderation и django-comments-xtd для осуществления модерации комментариев. Сверху я использую следующую модель:

class VotableComment(XtdComment):
   vote_score = models.IntegerField(db_index=True, default=0)
   (...)

Сам XtdComment наследуется от модели Comment из пакета django-comments. Под капотом все это работает через OneToOneField s, то есть:

migrations.CreateModel(
    name='XtdComment',
    fields=[
            ('comment_ptr', models.OneToOneField(auto_created=True, primary_key=True, parent_link=True, serialize=False, to='django_comments.Comment', on_delete=models.CASCADE)),
    (...)
migrations.CreateModel(
    name='VotableComment',
    fields=[
            ('xtdcomment_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='django_comments_xtd.XtdComment')),
    (...)

Это означает, что объект VotableComment должен иметь как comment_ptr, так и xtdcomment_ptr в качестве атрибутов.

Ошибка возникает, когда django-moderation пытается установить атрибут changed_object (который относится к объекту VotableComment) его модели ModeratedObject, которая является полем SerializedObjectField. Затем я получаю:

Error

Основная проблема возникает при десериализации и попытке установить значения полей объекта VotableComment, получая значение от его родителя моделей. В частности, поле comment_ptr:

Error2

Error3

Как вы можете видеть, есть проблема при попытке установить comment_ptr со значением <Comment: :...> на модели VotableComment, потому что позже related_descriptors.py сначала пытается разрешить все inherited_pk_fields. Есть два из них, которые происходят из родительской модели (XtdComment) и модели деда (Comment). Он отказывает во втором, потому что пытается получить доступ к <Comment: :...>.comment_ptr, когда он должен обращаться к своей родительской модели <XtdComment>.comment_ptr. Обратите внимание, что первое полетекапак_полноценно работает нормально, потому что оно разрешается в <Comment>.id, которое существует.

Я думаю, мне придется реализовать собственную логику модерации c, поскольку, похоже, возникают проблемы с моделями, которые имеют множественное наследование, но любая помощь очень ценится. Спасибо!

...