You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在strawberry_django的CUD操作中基于UUID而非PK定位模型(不重写update)

基于UUID字段实现strawberry-django的CUD定位(无需重写update方法)

方法一:通过输入类指定lookup字段

这是最简洁的实现方式,利用strawberry_django.input的lookup_field参数,直接指定用来定位模型实例的UUID字段:

  1. 确保你的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)
  1. 定义更新输入类时,指定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
  1. 绑定到GraphQL Mutation:
@strawberry.type
class Mutation:
    update_your_model: YourModelType = mutations.update(input=UpdateYourModelInput)

发起更新请求时,GraphQL会自动用传入的UUID值定位目标实例,完全无需重写update方法。

方法二:自定义查询集函数

如果需要添加额外逻辑(比如权限校验),可以通过get_queryset参数传入自定义函数,在函数内基于UUID过滤实例:

  1. 定义包含UUID字段的输入类:
@input(YourModel)
class UpdateYourModelInput:
    uuid: uuid.UUID
    title: str | None
  1. 编写自定义查询集函数:
def get_instance_by_uuid(info, data):
    # 可在此添加权限判断、额外过滤等逻辑
    return YourModel.objects.filter(uuid=data.uuid)
  1. 绑定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:50:03