Сделайте циклически зависимыми свойства модели в графене-Джанго - PullRequest
0 голосов
/ 06 апреля 2019

Скажем, у меня есть модели Django, выглядящие следующим образом:

class User(Model):
    username = CharField(...)

    @property
    def projects(self):
        return # projects the user is assigned to

class Project(Model):
    name = CharField(...)

    @property
    def users(self):
        return # users assigned to the project

class Assignment(Model):
    user = ForeignKey(User)
    project = ForeignKey(Project)

(я намеренно не писал наборы запросов для свойств, чтобы сделать код более читабельным.)

Я хотел быбыть в состоянии увидеть эти свойства в запросах графена-Джанго.Мои ModelType классы выглядят так:

class UserType(DjangoObjectType):
    class Meta:
        model = User

    projects = List(ProjectType)


class ProjectType(DjangoObjectType):
    class Meta:
        model = Project

    users = List(UserType)

Однако этот код не работает, поскольку ProjectType в классе UserType не определен, и замена этих классов не очень поможет.

Я пытался вообще не включать свойства, и после создания всех классов ModelType я пытался добавить свойства через setattr().Такой хак наверняка устанавливает атрибуты, поэтому классы имеют точно такую ​​же структуру, но кажется, что уже слишком поздно: свойства вообще не доступны из GraphQL.

Теперь у меня закончились идеи.Есть ли способ добиться желаемого поведения?

1 Ответ

0 голосов
/ 06 апреля 2019

Атрибуты класса ModelType имеют значение только при инициализации класса. Способ добавления полей позже - добавить их непосредственно в то место, где они находятся. Решение:

class UserType(DjangoObjectType):
    class Meta:
        model = User


class ProjectType(DjangoObjectType):
    class Meta:
        model = Project

UserType._meta.fields["projects"] = get_field_as(List(ProjectType), _as=Field)
ProjectType._meta.fields["users"] = get_field_as(List(UserType), _as=Field)

и оба свойства работают как нужно.

...