Graphene-Django 创建多个实例

Graphene-Django create multiple instances

假设我有一个 models.py 有两个表:

class Category(models.Model):
    cat = models.CharField(max_length=100)


class Thing(models.Model):
    desc = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True)

我的架构如下:

class ThingType(DjangoObjectType):
    class Meta:
        model = Thing


class FindThing(graphene.ObjectType):
    things = graphene.List(
        ThingType,
        search=graphene.String(),
        thing=graphene.ID(),
    )

    def resolve_things(self, info, thing=None, search=None, **kwargs):
        qs = Thing.objects.all()

        if search:
            filter = (
                Q(desc__icontains=search)
            )
            qs = qs.filter(filter)
        if thing:
            qs = qs.filter(id=thing)

        return qs


class CreateThing(graphene.Mutation):
    id = graphene.Int()
    desc = graphene.String()
    category = graphene.Field(FindCategory)

    class Arguments:
        desc = graphene.String()
        category = graphene.Int()

    def mutate(self, info, desc, category):
        thing = Thing(
            desc=desc,
            category=Category.objects.get(id=category)
        )
        thing.save()

        return CreateThing(
            id=thing.id,
            desc=thing.desc,
            category=thing.category_id
        )
class CategoryType(DjangoObjectType):
    class Meta:
        model = Category


class GetCategory(graphene.ObjectType):
    category = graphene.List(
        CategoryType,
        category=graphene.String(),
    )

    def resolve_category(self, info, category=None, **kwargs):
        qs = Category.objects.all()

        if category:
            get = (
                Q(category__contains=category)
            )
            qs = qs.get(get)

        return qs


class FindCategory(graphene.ObjectType):
    categories = graphene.List(
        CategoryType,
        search=graphene.String(),
        cat=graphene.ID(),
    )

    def resolve_categories(self, info, cat=None, search=None, **kwargs):
        qs = Category.objects.all()

        if search:
            filter = (
                Q(cat__icontains=search)
            )
            qs = qs.filter(filter)
        if cat:
            qs = qs.filter(id=cat)

        return qs


class CreateCategory(graphene.Mutation):
    id = graphene.Int()
    cat = graphene.String()
    desc = graphene.String()

    class Arguments:
        cat = graphene.String()
        desc = graphene.String()

    def mutate(self, info, cat, desc):
        category = Category(
            cat=cat
        )
        category.save()
        thing = Thing(
            desc=desc,
            category_id=category.id
        )
        thing.save()

        return CreateCategory(
            id=category.id,
            cat=category.cat,
            desc=thing.desc,
        )

我已经成功地创建了一个模式,可以在其中创建一个新类别,该类别已经链接到一个新创建的单一事物:

mutation createCategory{
  createCategory(cat:"cat7", desc:"defg"){
    id
    cat
    desc
  }
}

是否可以创建一个 CreateCategory django-graphene 模式,其中可以创建一个包含多个新事物的类别?

您可以允许 CreateCategory 突变接受多个事物的描述列表:

CreateCategory:
    descs = graphene.List(String)

    class Arguments:
    descs = graphene.List(String)

然后在 mutate 函数中遍历此列表:

new_things = []

for desc in descs:
    thing = Thing(
        desc=desc,
        category_id=category.id
    )
    thing.save()
    new_things.append(thing.desc)

return CreateCategory(
    id=category.id,
    cat=category.cat,
    descs=new_things
)