Мутация не работает с графеном Джанго - AttributeError ссылается на несуществующий атрибут - PullRequest
0 голосов
/ 10 октября 2019

Я делаю проект с Джанго и графен-Джанго. У меня есть следующие модели:

from django.db import models


class Address(models.Model):
    class Meta:
        verbose_name_plural = "Addresses"

    number = models.CharField(max_length=4)
    street = models.CharField(max_length=100)
    city = models.CharField(max_length=100)
    postcode = models.CharField(max_length=7)


class Person(models.Model):
    class Meta:
        verbose_name_plural = "Persons"

    avatar = models.ImageField(upload_to='images/avatars/')
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    address = models.ForeignKey(Address, on_delete=models.CASCADE)
    personal_image = models.ImageField(upload_to='images/personal_images/')

    def get_fullname(self):
        return self.first_name + ' ' + self.last_name

Моя корневая схема:

import people.person.schema
import graphene

from graphene_django.debug import DjangoDebug


class Query(
    people.person.schema.Query,
    graphene.ObjectType,
):
    debug = graphene.Field(DjangoDebug, name="_debug")


class Mutations(
    people.person.schema.Mutations,
    graphene.ObjectType,
):
    debug = graphene.Field(DjangoDebug, name="_debug")

schema = graphene.Schema(query=Query, mutation=Mutations)

И моя схема приложения:

import graphene
from graphene_django.types import DjangoObjectType

from .models import Person, Address


class PersonType(DjangoObjectType):
    class Meta:
        model = Person


class AddressType(DjangoObjectType):
    class Meta:
        model = Address


class Query(object):
    person = graphene.Field(PersonType, id=graphene.Int(), first_name=graphene.String())
    all_persons = graphene.List(PersonType)

    address = graphene.Field(
        AddressType, id=graphene.Int(), name=graphene.String()
    )
    all_addresses = graphene.List(AddressType)

    def resolve_all_persons(self, context):
        return Person.objects.all()

    def resolve_all_addresses(self, context):
        # We can easily optimize query count in the resolve method
        return Address.objects.select_related("person").all()

    def resolve_person(self, context, id=None, firstName=None, lastName=None):
        if id is not None:
            return Person.objects.get(pk=id)

        if firstName is not None:
            return Person.objects.get(first_name=firstName)

        if lastName is not None:
            return Person.objects.get(first_name=firstName)

        return None

    def resolve_address(self, context, id=None, postCode=None):
        if id is not None:
            return Address.objects.get(pk=id)

        if postCode is not None:
            return Address.objects.get(postcode=postCode)

        return None


class CreatePerson(graphene.Mutation):
    class Arguments:
        fname = graphene.String()

    person = graphene.Field(Person)

    def mutate(selfself, info, fname):
        person = Person(
            first_name=fname
        )
        return CreatePerson(person=person)

class Mutations(graphene.ObjectType):
    create_person = CreatePerson.Field()

Когда я запускаю запрос вGraphiQL:

mutation createPerson {
    createPerson(fname: "Bob"){
    person {
      firstName
    }
  }
}

Я получаю ошибку ImportError: Невозможно импортировать people.schema.schema для настройки графена 'SCHEMA'. AttributeError: тип объекта «Person» не имеет атрибута «name» в моем терминале.

У меня нет атрибута name для модели Person. Как мне создать нового человека? Изменение модели таким образом, чтобы она имела только одно поле и никакие ForeignKeys, похоже, не работали. Не уверен, что я правильно структурирую запрос>> 1015 *

...