Мутации графена/джанго возвращают ноль

Я создал следующую модель в своем приложении django:

class Post(models.Model):
    title = models.CharField(max_length=125, unique=True)
    slug_title = models.SlugField(max_length=255, unique=True)
    body = models.TextField()
    published_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    status = models.BooleanField(default=False)

    class Meta:
        ordering = ['-published_date']

    def __str__(self):
        return self.title
    
    def save(self, *args, **kwargs):
        self.slug_title = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

Я хочу иметь возможность использовать API для выполнения запросов POST/GET позже, поэтому я решил использовать graphene-django. Все правильно установлено и работает.

В соответствии с учебными пособиями я создал свой файл schema.py следующим образом:

# define schema
class PostType(DjangoObjectType):
    class Meta:
        model = Post
        fields = ('title', 'body', 'author', 'published_date', 'status', 'slug_title')

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

class PostInput(graphene.InputObjectType):
    title = graphene.String()
    slug_title = graphene.String()
    body = graphene.String()
    author = graphene.Int()
    published_date = graphene.DateTime()
    status=graphene.Boolean()

class CreatePost(graphene.Mutation):
    class Arguments:
        input = PostInput(required=True)

    post = graphene.Field(PostType)
    
    @classmethod
    def mutate(cls, root, info, input):
        post = Post()
        post.title = input.title
        post.slug_title = input.slug_title
        post.body = input.body
        post.author = input.author
        post.published_date = input.published_date
        post.status = input.status
        post.save()

        return CreatePost(post=post)

class Query(graphene.ObjectType):

    all_posts = graphene.List(PostType)
    author_by_username = graphene.Field(UserType, username=graphene.String())
    posts_by_author = graphene.List(PostType, username=graphene.String())
    posts_by_slug = graphene.List(PostType, slug=graphene.String())


    def resolve_all_posts(root, info):
        return Post.objects.all()
    
    def resolve_author_by_username(root, info, username):
        return User.objects.get(username=username)
    
    def resolve_posts_by_author(root, info, username):
        return Post.objects.filter(author__username=username)
    
    def resolve_posts_by_slug(root, info, slug):
        return Post.objects.filter(slug_title=slug)

class Mutation(graphene.ObjectType):
    create_post=CreatePost.Field()

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

Часть запроса работает, как и ожидалось, но мой раздел мутаций, похоже, не работает. Когда я пытаюсь создать мутацию, я получаю следующее:

{
  "data": {
    "create_post": {
      "post": null
    }
  }
}

Я создал быстрый тест, чтобы увидеть, будут ли выдаваться какие-либо ошибки при запуске мутации, но там все в порядке.

def test_mutation_1(self):
        response = self.query(
            '''
            mutation {
                createPost(input:{
                    title:"Test Title", 
                    body:"Test body", 
                    author:1, 
                    publishedDate:"2016-07-20T17:30:15+05:30", 
                    status:false
                })
                {
                    post {
                    title
                    }
                }
            }
            '''
        )

        self.assertResponseNoErrors(response)

Я не получаю сообщений об ошибках.

Любая помощь будет оценена по достоинству!

У вас есть ошибки?

jorzel 30.09.2022 22:49

@jorzel ошибок нет, но мутация не работает - не создает новый пост.

pipocaDourada 01.10.2022 09:33

Вы уверены, что response.get('errors') - это пустой массив? Graphene всегда возвращает 200, даже если есть ошибка. Не могли бы вы показать, как называется мутация?

jorzel 01.10.2022 12:47

@jorzel Я добавил в этот пост тест на мутацию, который я провожу, чтобы убедиться, что все работает хорошо. Я не получаю сообщений об ошибках там.

pipocaDourada 02.10.2022 11:49

@jorzel Я сделал другой тест и получил это сообщение об ошибке -> errors=[GraphQLError('Cannot assign "1": "Post.author" must be a "User" instance.'

pipocaDourada 02.10.2022 12:01

@pipocaDourada Какой тест вы сделали, чтобы узнать?

Wilfried FUTCHEA 19.11.2022 10:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка: errors=[GraphQLError('Cannot assign "1": "Post.author" must be a "User" instance.'

Решение: измените мой класс CreatePost на следующее:

post.author = User.objects.get(pk=input.author_id)

Вместо:

post.author = input.author_id

Я почти уверен, что это что-то о графене 3 ... Похоже, никогда не добавляйте графен 2.x.

Wilfried FUTCHEA 19.11.2022 10:05

Другие вопросы по теме