如何在strawberry_django的CUD操作中基于UUID而非PK定位模型(不重写update)
基于UUID字段实现strawberry-django的CUD定位(无需重写update方法)
方法一:通过输入类指定lookup字段
这是最简洁的实现方式,利用strawberry_django.input的lookup_field参数,直接指定用来定位模型实例的UUID字段:
- 确保你的Django模型包含UUID字段(可作为主键或独立唯一字段):
from django.db import models import uuid class YourModel(models.Model): # 场景1:UUID作为主键 id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # 场景2:UUID作为独立唯一字段 # uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) title = models.CharField(max_length=255)
- 定义更新输入类时,指定
lookup_field为你的UUID字段名:
import strawberry from strawberry_django import input, mutations # 场景1填"id",场景2填"uuid" @input(YourModel, lookup_field="id") class UpdateYourModelInput: title: str | None
- 绑定到GraphQL Mutation:
@strawberry.type class Mutation: update_your_model: YourModelType = mutations.update(input=UpdateYourModelInput)
发起更新请求时,GraphQL会自动用传入的UUID值定位目标实例,完全无需重写update方法。
方法二:自定义查询集函数
如果需要添加额外逻辑(比如权限校验),可以通过get_queryset参数传入自定义函数,在函数内基于UUID过滤实例:
- 定义包含UUID字段的输入类:
@input(YourModel) class UpdateYourModelInput: uuid: uuid.UUID title: str | None
- 编写自定义查询集函数:
def get_instance_by_uuid(info, data): # 可在此添加权限判断、额外过滤等逻辑 return YourModel.objects.filter(uuid=data.uuid)
- 绑定Mutation时传入该函数:
@strawberry.type class Mutation: update_your_model: YourModelType = mutations.update( input=UpdateYourModelInput, get_queryset=get_instance_by_uuid )
这种方式适合需要在定位实例前做额外处理的场景,同样不需要修改strawberry_django.mutations.update的源码。
内容的提问来源于stack exchange,提问作者Lukasz Dynowski
相关产品推荐
相关产品推荐

