Джанго многостоловое наследование и графен

Я пытаюсь обслуживать конечную точку graphql через django-графен. У меня есть следующие модели:

class BaseModel(models.Model):
    fk = models.ForeignKey(MainModel, related_name='bases')
    base_info = models.CharField(...)

class ChildModel(BaseModel):
    name = models.CharField(...)

MainModel быть моей центральной моделью данных. Есть несколько вариантов ChildModel, который объясняет многостоловое наследование, используемое здесь. Я смог заставить вещи работать с этим объявлением схемы:

class BaseModelType(DjangoObjectType):
    class Meta:
        model = BaseModel

class ChildModelType(DjangoObjectType):
    class Meta:
        model = ChildModel

class MainModelType(DjangoObjectType):
    class Meta:
        model = MainModel

который разрешает следующий запрос graphQL:

{
  mainModel(id: 123) {
    id
    bases {
      id
      baseInfo
      childmodel {
        id
        name
      }
    }
  }
}

Тем не менее, я хотел бы сгладить это так, как Django понимает наследование, чтобы я мог запрашивать данные следующим образом:

{
  mainModel(id: 123) {
    id
    bases {
      id
      baseInfo
      name        <--- this field from the child is now on the base level
    }
  }
}

Я подозреваю, что ответ в том, как я заявляю ChildModelType, но я не смог понять это. Любые намеки приветствуются!

1 ответ

Решение

Вы можете сделать это, объявив дополнительное поле и разрешив метод в BaseModelType учебный класс:

class BaseModelType(DjangoObjectType):
    name_from_child = graphene.String()

    class Meta:
        model = BaseModel

    def resolve_name_from_child(self, info):
        # if ChildModel have ForeignKey to BaseModel
        # first_child = self.childmodel_set.first()

        # for your case with multi-table inheritance
        # ChildModel is derived from BaseModel: class ChildModel(BaseModel):
        first_child = self.childmodel

        if first_child:
            return first_child.name
        return None

запрос:

{
  mainModel(id: 123) {
    id
    bases {
      id
      baseInfo
      name_from_child   <--- first child name
    }
  }
}
Другие вопросы по тегам