Я делаю проект с Джанго и графен-Джанго. У меня есть следующие модели:
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 *