Джанго многостоловое наследование и графен
Я пытаюсь обслуживать конечную точку 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
}
}
}