graphene-django-cud icon indicating copy to clipboard operation
graphene-django-cud copied to clipboard

before_save not being executed

Open HopeBaron opened this issue 3 years ago • 2 comments
trafficstars


class CreateTableMutation(mutations.DjangoCreateMutation):
    class Meta:
        model = Table
        exclude_fields = ('owner',)
    create_column = CreateTableColumnMutation.Field()

    @classmethod
    def before_save(cls, root, info, input, obj: Table):
        obj.owner = User.objects.get(pk=1)
        return obj

I've the following code, before_save doesn't get executed (I copied the example in docs)

this is what I get:

{
  "errors": [
    {
      "message": "NOT NULL constraint failed: query_builder_table.owner_id",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createTable"
      ]
    }
  ],
  "data": {
    "createTable": null
  }
}

It's supposed to provide the owner object through the before_save, right?

HopeBaron avatar Mar 30 '22 16:03 HopeBaron

Is there any update about this issue?

demsking avatar Nov 01 '23 14:11 demsking

Hi. I'm sorry for the delayed response.

This is a bug. If you want a quick potential fix, I would move this handling to before_mutate as so:

@classmethod
def before_mutate(cls, root, info, input):
    input["owner"] = 1
    return input

The issue here is that for create mutations, before_save is not called until after the first object instantiation and save (by use of the .create method).

Similarly, for update mutations, a .save call is also applied before the before_save call.

I think the naming set by the library for these hooks is unfortunate. However, I think trying to remove all save calls in the internal methods (.create_obj and .update_obj) might be tricky and impose breaking changes. But either that has to happen, or the naming has to change.

I'll put some priority on resolving this task and keep you posted on which direction I move in.

tOgg1 avatar Feb 27 '24 15:02 tOgg1